From b44bce0ed40a2d03cb1f08e3a5e7d41df8caa83f Mon Sep 17 00:00:00 2001 From: Beman Dawes Date: Fri, 7 Jul 2000 16:04:40 +0000 Subject: [PATCH] This commit was generated by cvs2svn to compensate for changes in r4, which included commits to RCS files with non-trunk default branches. [SVN r7621] --- .gitattributes | 96 +++++++++ compose.hpp | 442 ++++++++++++++++++++++++++++++++++++++ compose1.cpp | 37 ++++ compose2.cpp | 42 ++++ compose3.cpp | 37 ++++ compose4.cpp | 37 ++++ include/boost/compose.hpp | 226 +++++++++++++++++++ print.hpp | 28 +++ 8 files changed, 945 insertions(+) create mode 100644 .gitattributes create mode 100644 compose.hpp create mode 100644 compose1.cpp create mode 100644 compose2.cpp create mode 100644 compose3.cpp create mode 100644 compose4.cpp create mode 100644 include/boost/compose.hpp create mode 100644 print.hpp diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3e84d7c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,96 @@ +* text=auto !eol svneol=native#text/plain +*.gitattributes text svneol=native#text/plain + +# Scriptish formats +*.bat text svneol=native#text/plain +*.bsh text svneol=native#text/x-beanshell +*.cgi text svneol=native#text/plain +*.cmd text svneol=native#text/plain +*.js text svneol=native#text/javascript +*.php text svneol=native#text/x-php +*.pl text svneol=native#text/x-perl +*.pm text svneol=native#text/x-perl +*.py text svneol=native#text/x-python +*.sh eol=lf svneol=LF#text/x-sh +configure eol=lf svneol=LF#text/x-sh + +# Image formats +*.bmp binary svneol=unset#image/bmp +*.gif binary svneol=unset#image/gif +*.ico binary svneol=unset#image/ico +*.jpeg binary svneol=unset#image/jpeg +*.jpg binary svneol=unset#image/jpeg +*.png binary svneol=unset#image/png +*.tif binary svneol=unset#image/tiff +*.tiff binary svneol=unset#image/tiff +*.svg text svneol=native#image/svg%2Bxml + +# Data formats +*.pdf binary svneol=unset#application/pdf +*.avi binary svneol=unset#video/avi +*.doc binary svneol=unset#application/msword +*.dsp text svneol=crlf#text/plain +*.dsw text svneol=crlf#text/plain +*.eps binary svneol=unset#application/postscript +*.gz binary svneol=unset#application/gzip +*.mov binary svneol=unset#video/quicktime +*.mp3 binary svneol=unset#audio/mpeg +*.ppt binary svneol=unset#application/vnd.ms-powerpoint +*.ps binary svneol=unset#application/postscript +*.psd binary svneol=unset#application/photoshop +*.rdf binary svneol=unset#text/rdf +*.rss text svneol=unset#text/xml +*.rtf binary svneol=unset#text/rtf +*.sln text svneol=native#text/plain +*.swf binary svneol=unset#application/x-shockwave-flash +*.tgz binary svneol=unset#application/gzip +*.vcproj text svneol=native#text/xml +*.vcxproj text svneol=native#text/xml +*.vsprops text svneol=native#text/xml +*.wav binary svneol=unset#audio/wav +*.xls binary svneol=unset#application/vnd.ms-excel +*.zip binary svneol=unset#application/zip + +# Text formats +.htaccess text svneol=native#text/plain +*.bbk text svneol=native#text/xml +*.cmake text svneol=native#text/plain +*.css text svneol=native#text/css +*.dtd text svneol=native#text/xml +*.htm text svneol=native#text/html +*.html text svneol=native#text/html +*.ini text svneol=native#text/plain +*.log text svneol=native#text/plain +*.mak text svneol=native#text/plain +*.qbk text svneol=native#text/plain +*.rst text svneol=native#text/plain +*.sql text svneol=native#text/x-sql +*.txt text svneol=native#text/plain +*.xhtml text svneol=native#text/xhtml%2Bxml +*.xml text svneol=native#text/xml +*.xsd text svneol=native#text/xml +*.xsl text svneol=native#text/xml +*.xslt text svneol=native#text/xml +*.xul text svneol=native#text/xul +*.yml text svneol=native#text/plain +boost-no-inspect text svneol=native#text/plain +CHANGES text svneol=native#text/plain +COPYING text svneol=native#text/plain +INSTALL text svneol=native#text/plain +Jamfile text svneol=native#text/plain +Jamroot text svneol=native#text/plain +Jamfile.v2 text svneol=native#text/plain +Jamrules text svneol=native#text/plain +Makefile* text svneol=native#text/plain +README text svneol=native#text/plain +TODO text svneol=native#text/plain + +# Code formats +*.c text svneol=native#text/plain +*.cpp text svneol=native#text/plain +*.h text svneol=native#text/plain +*.hpp text svneol=native#text/plain +*.ipp text svneol=native#text/plain +*.tpp text svneol=native#text/plain +*.jam text svneol=native#text/plain +*.java text svneol=native#text/plain diff --git a/compose.hpp b/compose.hpp new file mode 100644 index 0000000..5401fa2 --- /dev/null +++ b/compose.hpp @@ -0,0 +1,442 @@ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +/* supplementing compose function objects + * Son Dez 26 22:11:12 MET 1999 + */ +#ifndef BOOST_COMPOSE_HPP +#define BOOST_COMPOSE_HPP + +#include + +namespace boost { + +/********************************************************** + * type nullary_function + * - as supplement to unary_function and binary_function + **********************************************************/ +template +struct nullary_function { + typedef Result result_type; +}; + +/********************************************************** + * ptr_fun for functions with no argument + **********************************************************/ +template +class pointer_to_nullary_function : public nullary_function +{ + protected: + Result (*ptr)(); + public: + pointer_to_nullary_function() { + } + explicit pointer_to_nullary_function(Result (*x)()) : ptr(x) { + } + Result operator()() const { + return ptr(); + } +}; + +template +inline pointer_to_nullary_function ptr_fun(Result (*x)()) +{ + return pointer_to_nullary_function(x); +} + +/*********** compose_f_gx_t and compose_f_gx **********************/ + +/* class for the compose_f_gx adapter + */ +template +class compose_f_gx_t + : public std::unary_function +{ + private: + OP1 op1; // process: op1(op2(x)) + OP2 op2; + public: + // constructor + compose_f_gx_t(const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x) const { + return op1(op2(x)); + } +}; + +/* convenience functions for the compose_f_gx adapter + */ +template +inline compose_f_gx_t +compose_f_gx (const OP1& o1, const OP2& o2) { + return compose_f_gx_t(o1,o2); +} + +/*********** compose_f_gx_hx_t and compose_f_gx_hx **********************/ + +/* class for the compose_f_gx_hx adapter + */ +template +class compose_f_gx_hx_t + : public std::unary_function +{ + private: + OP1 op1; // process: op1(op2(x),op3(x)) + OP2 op2; + OP3 op3; + public: + // constructor + compose_f_gx_hx_t (const OP1& o1, const OP2& o2, const OP3& o3) + : op1(o1), op2(o2), op3(o3) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x) const { + return op1(op2(x),op3(x)); + } +}; + +/* convenience functions for the compose_f_gx_hx adapter + */ +template +inline compose_f_gx_hx_t +compose_f_gx_hx (const OP1& o1, const OP2& o2, const OP3& o3) { + return compose_f_gx_hx_t(o1,o2,o3); +} + +/*********** compose_f_gxy_t and compose_f_gxy **********************/ + +/* class for the compose_f_gxy adapter + */ +template +class compose_f_gxy_t + : public std::binary_function +{ + private: + OP1 op1; // process: op1(op2(x,y)) + OP2 op2; + public: + // constructor + compose_f_gxy_t (const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::first_argument_type& x, + const typename OP2::second_argument_type& y) const { + return op1(op2(x,y)); + } +}; + +/* convenience function for the compose_f_gxy adapter + */ +template +inline compose_f_gxy_t +compose_f_gxy (const OP1& o1, const OP2& o2) { + return compose_f_gxy_t(o1,o2); +} + +/*********** compose_f_gx_hy_t and compose_f_gx_hy **********************/ + +/* class for the compose_f_gx_hy adapter + */ +template +class compose_f_gx_hy_t + : public std::binary_function +{ + private: + OP1 op1; // process: op1(op2(x),op3(y)) + OP2 op2; + OP3 op3; + public: + // constructor + compose_f_gx_hy_t (const OP1& o1, const OP2& o2, const OP3& o3) + : op1(o1), op2(o2), op3(o3) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x, + const typename OP3::argument_type& y) const { + return op1(op2(x),op3(y)); + } +}; + +/* convenience function for the compose_f_gx_hy adapter + */ +template +inline compose_f_gx_hy_t +compose_f_gx_hy (const OP1& o1, const OP2& o2, const OP3& o3) { + return compose_f_gx_hy_t(o1,o2,o3); +} + +/*********** compose_f_g_t and compose_f_g **********************/ + +/* class for the compose_f_g adapter + */ +template +class compose_f_g_t + : public boost::nullary_function +{ + private: + OP1 op1; // process: op1(op2()) + OP2 op2; + public: + // constructor + compose_f_g_t(const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()() const { + return op1(op2()); + } +}; + +/* convenience functions for the compose_f_g adapter + */ +template +inline compose_f_g_t +compose_f_g (const OP1& o1, const OP2& o2) { + return compose_f_g_t(o1,o2); +} + +} /* namespace boost */ + +#endif /*BOOST_COMPOSE_HPP*/ +/* supplementing compose function objects + * Son Dez 26 22:14:55 MET 1999 + */ +#ifndef BOOST_COMPOSE_HPP +#define BOOST_COMPOSE_HPP + +#include + +namespace boost { + +/********************************************************** + * type nullary_function + * - as supplement to unary_function and binary_function + **********************************************************/ +template +struct nullary_function { + typedef Result result_type; +}; + +/********************************************************** + * ptr_fun for functions with no argument + **********************************************************/ +template +class pointer_to_nullary_function : public nullary_function +{ + protected: + Result (*ptr)(); + public: + pointer_to_nullary_function() { + } + explicit pointer_to_nullary_function(Result (*x)()) : ptr(x) { + } + Result operator()() const { + return ptr(); + } +}; + +template +inline pointer_to_nullary_function ptr_fun(Result (*x)()) +{ + return pointer_to_nullary_function(x); +} + +/*********** compose_f_gx_t and compose_f_gx **********************/ + +/* class for the compose_f_gx adapter + */ +template +class compose_f_gx_t + : public std::unary_function +{ + private: + OP1 op1; // process: op1(op2(x)) + OP2 op2; + public: + // constructor + compose_f_gx_t(const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x) const { + return op1(op2(x)); + } +}; + +/* convenience functions for the compose_f_gx adapter + */ +template +inline compose_f_gx_t +compose_f_gx (const OP1& o1, const OP2& o2) { + return compose_f_gx_t(o1,o2); +} + +/*********** compose_f_gx_hx_t and compose_f_gx_hx **********************/ + +/* class for the compose_f_gx_hx adapter + */ +template +class compose_f_gx_hx_t + : public std::unary_function +{ + private: + OP1 op1; // process: op1(op2(x),op3(x)) + OP2 op2; + OP3 op3; + public: + // constructor + compose_f_gx_hx_t (const OP1& o1, const OP2& o2, const OP3& o3) + : op1(o1), op2(o2), op3(o3) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x) const { + return op1(op2(x),op3(x)); + } +}; + +/* convenience functions for the compose_f_gx_hx adapter + */ +template +inline compose_f_gx_hx_t +compose_f_gx_hx (const OP1& o1, const OP2& o2, const OP3& o3) { + return compose_f_gx_hx_t(o1,o2,o3); +} + +/*********** compose_f_gxy_t and compose_f_gxy **********************/ + +/* class for the compose_f_gxy adapter + */ +template +class compose_f_gxy_t + : public std::binary_function +{ + private: + OP1 op1; // process: op1(op2(x,y)) + OP2 op2; + public: + // constructor + compose_f_gxy_t (const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::first_argument_type& x, + const typename OP2::second_argument_type& y) const { + return op1(op2(x,y)); + } +}; + +/* convenience function for the compose_f_gxy adapter + */ +template +inline compose_f_gxy_t +compose_f_gxy (const OP1& o1, const OP2& o2) { + return compose_f_gxy_t(o1,o2); +} + +/*********** compose_f_gx_hy_t and compose_f_gx_hy **********************/ + +/* class for the compose_f_gx_hy adapter + */ +template +class compose_f_gx_hy_t + : public std::binary_function +{ + private: + OP1 op1; // process: op1(op2(x),op3(y)) + OP2 op2; + OP3 op3; + public: + // constructor + compose_f_gx_hy_t (const OP1& o1, const OP2& o2, const OP3& o3) + : op1(o1), op2(o2), op3(o3) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x, + const typename OP3::argument_type& y) const { + return op1(op2(x),op3(y)); + } +}; + +/* convenience function for the compose_f_gx_hy adapter + */ +template +inline compose_f_gx_hy_t +compose_f_gx_hy (const OP1& o1, const OP2& o2, const OP3& o3) { + return compose_f_gx_hy_t(o1,o2,o3); +} + +/*********** compose_f_g_t and compose_f_g **********************/ + +/* class for the compose_f_g adapter + */ +template +class compose_f_g_t + : public boost::nullary_function +{ + private: + OP1 op1; // process: op1(op2()) + OP2 op2; + public: + // constructor + compose_f_g_t(const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()() const { + return op1(op2()); + } +}; + +/* convenience functions for the compose_f_g adapter + */ +template +inline compose_f_g_t +compose_f_g (const OP1& o1, const OP2& o2) { + return compose_f_g_t(o1,o2); +} + +} /* namespace boost */ + +#endif /*BOOST_COMPOSE_HPP*/ diff --git a/compose1.cpp b/compose1.cpp new file mode 100644 index 0000000..f140bd5 --- /dev/null +++ b/compose1.cpp @@ -0,0 +1,37 @@ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +#include +#include +#include +#include +#include +#include "print.hpp" +#include "compose.hpp" +using namespace std; +using namespace boost; + +int main() +{ + vector coll; + + // insert elements from 1 to 9 + for (int i=1; i<=9; ++i) { + coll.push_back(i); + } + PRINT_ELEMENTS(coll); + + // for each element add 10 and multiply by 5 + transform (coll.begin(),coll.end(), + ostream_iterator(cout," "), + compose_f_gx(bind2nd(multiplies(),5), + bind2nd(plus(),10))); + cout << endl; +} diff --git a/compose2.cpp b/compose2.cpp new file mode 100644 index 0000000..2320ae8 --- /dev/null +++ b/compose2.cpp @@ -0,0 +1,42 @@ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +#include +#include +#include +#include +#include "print.hpp" +#include "compose.hpp" +using namespace std; +using namespace boost; + +int main() +{ + vector coll; + + // insert elements from 1 to 9 + for (int i=1; i<=9; ++i) { + coll.push_back(i); + } + PRINT_ELEMENTS(coll); + + // remove all elements that are greater than four and less than seven + // - retain new end + vector::iterator pos; + pos = remove_if (coll.begin(),coll.end(), + compose_f_gx_hx(logical_and(), + bind2nd(greater(),4), + bind2nd(less(),7))); + + // remove ``removed'' elements in coll + coll.erase(pos,coll.end()); + + PRINT_ELEMENTS(coll); +} diff --git a/compose3.cpp b/compose3.cpp new file mode 100644 index 0000000..20139d0 --- /dev/null +++ b/compose3.cpp @@ -0,0 +1,37 @@ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +#include +#include +#include +#include +#include +#include "compose.hpp" +using namespace std; +using namespace boost; + +int main() +{ + string s("Internationalization"); + string sub("Nation"); + + // search substring case insensitive + string::iterator pos; + pos = search (s.begin(),s.end(), // string to search in + sub.begin(),sub.end(), // substring to search + compose_f_gx_hy(equal_to(), // compar. criterion + ptr_fun(::toupper), + ptr_fun(::toupper))); + + if (pos != s.end()) { + cout << "\"" << sub << "\" is part of \"" << s << "\"" + << endl; + } +} diff --git a/compose4.cpp b/compose4.cpp new file mode 100644 index 0000000..56da059 --- /dev/null +++ b/compose4.cpp @@ -0,0 +1,37 @@ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +#include +#include +#include +#include +#include "print.hpp" +#include "compose.hpp" +using namespace std; +using namespace boost; + + +int main() +{ + list coll; + + // insert five random numbers + generate_n (back_inserter(coll), // beginning of destination range + 5, // count + rand); // new value generator + PRINT_ELEMENTS(coll); + + // overwrite with five new random numbers + // in the range between 0 (including) and 10 (excluding) + generate (coll.begin(), coll.end(), // destination range + compose_f_g(bind2nd(modulus(),10), + ptr_fun(rand))); + PRINT_ELEMENTS(coll); +} diff --git a/include/boost/compose.hpp b/include/boost/compose.hpp new file mode 100644 index 0000000..859038f --- /dev/null +++ b/include/boost/compose.hpp @@ -0,0 +1,226 @@ +/* supplementing compose function objects + * Fri Jul 16 21:01:58 MEST 1999 + */ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +#ifndef BOOST_COMPOSE_HPP +#define BOOST_COMPOSE_HPP + +#include + +namespace boost { + +/********************************************************** + * type nullary_function + * - as supplement to unary_function and binary_function + **********************************************************/ +template +struct nullary_function { + typedef Result result_type; +}; + +/********************************************************** + * ptr_fun for functions with no argument + **********************************************************/ +template +class pointer_to_nullary_function : public nullary_function +{ + protected: + Result (*ptr)(); + public: + pointer_to_nullary_function() { + } + explicit pointer_to_nullary_function(Result (*x)()) : ptr(x) { + } + Result operator()() const { + return ptr(); + } +}; + +template +inline pointer_to_nullary_function ptr_fun(Result (*x)()) +{ + return pointer_to_nullary_function(x); +} + +/*********** compose_f_gx_t and compose_f_gx **********************/ + +/* class for the compose_f_gx adapter + */ +template +class compose_f_gx_t + : public std::unary_function +{ + private: + OP1 op1; // process: op1(op2(x)) + OP2 op2; + public: + // constructor + compose_f_gx_t(const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x) const { + return op1(op2(x)); + } +}; + +/* convenience functions for the compose_f_gx adapter + */ +template +inline compose_f_gx_t +compose_f_gx (const OP1& o1, const OP2& o2) { + return compose_f_gx_t(o1,o2); +} + +/*********** compose_f_gx_hx_t and compose_f_gx_hx **********************/ + +/* class for the compose_f_gx_hx adapter + */ +template +class compose_f_gx_hx_t + : public std::unary_function +{ + private: + OP1 op1; // process: op1(op2(x),op3(x)) + OP2 op2; + OP3 op3; + public: + // constructor + compose_f_gx_hx_t (const OP1& o1, const OP2& o2, const OP3& o3) + : op1(o1), op2(o2), op3(o3) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x) const { + return op1(op2(x),op3(x)); + } +}; + +/* convenience functions for the compose_f_gx_hx adapter + */ +template +inline compose_f_gx_hx_t +compose_f_gx_hx (const OP1& o1, const OP2& o2, const OP3& o3) { + return compose_f_gx_hx_t(o1,o2,o3); +} + +/*********** compose_f_gxy_t and compose_f_gxy **********************/ + +/* class for the compose_f_gxy adapter + */ +template +class compose_f_gxy_t + : public std::binary_function +{ + private: + OP1 op1; // process: op1(op2(x,y)) + OP2 op2; + public: + // constructor + compose_f_gxy_t (const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::first_argument_type& x, + const typename OP2::second_argument_type& y) const { + return op1(op2(x,y)); + } +}; + +/* convenience function for the compose_f_gxy adapter + */ +template +inline compose_f_gxy_t +compose_f_gxy (const OP1& o1, const OP2& o2) { + return compose_f_gxy_t(o1,o2); +} + +/*********** compose_f_gx_hy_t and compose_f_gx_hy **********************/ + +/* class for the compose_f_gx_hy adapter + */ +template +class compose_f_gx_hy_t + : public std::binary_function +{ + private: + OP1 op1; // process: op1(op2(x),op3(y)) + OP2 op2; + OP3 op3; + public: + // constructor + compose_f_gx_hy_t (const OP1& o1, const OP2& o2, const OP3& o3) + : op1(o1), op2(o2), op3(o3) { + } + + // function call + typename OP1::result_type + operator()(const typename OP2::argument_type& x, + const typename OP3::argument_type& y) const { + return op1(op2(x),op3(y)); + } +}; + +/* convenience function for the compose_f_gx_hy adapter + */ +template +inline compose_f_gx_hy_t +compose_f_gx_hy (const OP1& o1, const OP2& o2, const OP3& o3) { + return compose_f_gx_hy_t(o1,o2,o3); +} + +/*********** compose_f_g_t and compose_f_g **********************/ + +/* class for the compose_f_g adapter + */ +template +class compose_f_g_t + : public boost::nullary_function +{ + private: + OP1 op1; // process: op1(op2()) + OP2 op2; + public: + // constructor + compose_f_g_t(const OP1& o1, const OP2& o2) + : op1(o1), op2(o2) { + } + + // function call + typename OP1::result_type + operator()() const { + return op1(op2()); + } +}; + +/* convenience functions for the compose_f_g adapter + */ +template +inline compose_f_g_t +compose_f_g (const OP1& o1, const OP2& o2) { + return compose_f_g_t(o1,o2); +} + +} /* namespace boost */ + +#endif /*BOOST_COMPOSE_HPP*/ diff --git a/print.hpp b/print.hpp new file mode 100644 index 0000000..4325f47 --- /dev/null +++ b/print.hpp @@ -0,0 +1,28 @@ +/* The following code example is taken from the book + * "The C++ Standard Library - A Tutorial and Reference" + * by Nicolai M. Josuttis, Addison-Wesley, 1999 + * + * (C) Copyright Nicolai M. Josuttis 1999. + * Permission to copy, use, modify, sell and distribute this software + * is granted provided this copyright notice appears in all copies. + * This software is provided "as is" without express or implied + * warranty, and with no claim as to its suitability for any purpose. + */ +#include + +/* PRINT_ELEMENTS() + * - prints optional C-string optcstr followed by + * - all elements of the collection coll + * - separated by spaces + */ +template +inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="") +{ + typename T::const_iterator pos; + + std::cout << optcstr; + for (pos=coll.begin(); pos!=coll.end(); ++pos) { + std::cout << *pos << ' '; + } + std::cout << std::endl; +}