mirror of
https://github.com/boostorg/functional.git
synced 2025-07-30 12:37:17 +02:00
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]
This commit is contained in:
96
.gitattributes
vendored
Normal file
96
.gitattributes
vendored
Normal file
@ -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
|
257
function_test.cpp
Normal file
257
function_test.cpp
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// Tests for the Boost functional.hpp header file
|
||||||
|
//
|
||||||
|
// Note that functional.hpp relies on partial specialisation to be
|
||||||
|
// effective. If your compiler lacks this feature, very few of the
|
||||||
|
// tests would compile, and so have been excluded from the test.
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2000
|
||||||
|
// Cadenza New Zealand Ltd
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, distribute and sell this software
|
||||||
|
// and its documentation for any purpose is hereby granted without
|
||||||
|
// fee, provided that the above copyright notice appears in all copies
|
||||||
|
// and that both the copyright notice and this permission notice
|
||||||
|
// appear in supporting documentation. Cadenza New Zealand Ltd makes
|
||||||
|
// no representations about the suitability of this software for any
|
||||||
|
// purpose. It is provided "as is" without express or implied
|
||||||
|
// warranty.
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// $Id$
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// $Log$
|
||||||
|
// Revision 1.1.1.1 2000/07/07 16:04:18 beman
|
||||||
|
// 1.16.1 initial CVS checkin
|
||||||
|
//
|
||||||
|
// Revision 1.3 2000/06/26 09:44:01 mark
|
||||||
|
// Updated following feedback from Jens Maurer.
|
||||||
|
//
|
||||||
|
// Revision 1.2 2000/05/17 08:31:45 mark
|
||||||
|
// Added extra tests now that function traits work correctly.
|
||||||
|
// For compilers with no support for partial specialisation,
|
||||||
|
// excluded tests that won't work.
|
||||||
|
//
|
||||||
|
// Revision 1.1 2000/05/07 09:14:41 mark
|
||||||
|
// Initial revision
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// To demonstrate what the boosted function object adapters do for
|
||||||
|
// you, try compiling with USE_STD defined. This will endeavour to
|
||||||
|
// use the standard function object adapters, but is likely to result
|
||||||
|
// in numerous errors due to the fact that you cannot have references
|
||||||
|
// to references.
|
||||||
|
#ifdef USE_STD
|
||||||
|
#include <functional>
|
||||||
|
#define boost std
|
||||||
|
#else
|
||||||
|
#include <boost/functional.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Person
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Person() {}
|
||||||
|
Person(const char *n) : name(n) {}
|
||||||
|
|
||||||
|
const std::string &get_name() const { return name; }
|
||||||
|
void print(std::ostream &os) const { os << name << " "; }
|
||||||
|
void set_name(const std::string &n) { name = n; std::cout << name << " "; }
|
||||||
|
std::string clear_name() { std::string ret = name; name = ""; return ret; }
|
||||||
|
void do_something(int) const {}
|
||||||
|
|
||||||
|
bool is_fred() const { return name == "Fred"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string name;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
bool is_equal(const std::string &s1, const std::string &s2)
|
||||||
|
{
|
||||||
|
return s1 == s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_betty(const std::string &s)
|
||||||
|
{
|
||||||
|
return s == "Betty";
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_set_name(Person *p, const std::string &name)
|
||||||
|
{
|
||||||
|
p->set_name(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_set_name_ref(Person &p, const std::string &name)
|
||||||
|
{
|
||||||
|
p.set_name(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::vector<Person> v1;
|
||||||
|
v1.push_back("Fred");
|
||||||
|
v1.push_back("Wilma");
|
||||||
|
v1.push_back("Barney");
|
||||||
|
v1.push_back("Betty");
|
||||||
|
|
||||||
|
const std::vector<Person> cv1(v1.begin(), v1.end());
|
||||||
|
|
||||||
|
std::vector<std::string> v2;
|
||||||
|
v2.push_back("Fred");
|
||||||
|
v2.push_back("Wilma");
|
||||||
|
v2.push_back("Barney");
|
||||||
|
v2.push_back("Betty");
|
||||||
|
|
||||||
|
Person person;
|
||||||
|
Person &r = person;
|
||||||
|
|
||||||
|
Person fred("Fred");
|
||||||
|
Person wilma("Wilma");
|
||||||
|
Person barney("Barney");
|
||||||
|
Person betty("Betty");
|
||||||
|
std::vector<Person*> v3;
|
||||||
|
v3.push_back(&fred);
|
||||||
|
v3.push_back(&wilma);
|
||||||
|
v3.push_back(&barney);
|
||||||
|
v3.push_back(&betty);
|
||||||
|
|
||||||
|
const std::vector<Person*> cv3(v3.begin(), v3.end());
|
||||||
|
std::vector<const Person*> v3c(v3.begin(), v3.end());
|
||||||
|
|
||||||
|
std::ostream &os = std::cout;
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
// unary_traits, unary_negate
|
||||||
|
std::transform(v2.begin(), v2.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::not1(is_betty));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v1.begin(), v1.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::not1(boost::mem_fun_ref(&Person::is_fred)));
|
||||||
|
|
||||||
|
// binary_traits, binary_negate
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v2.begin(), v2.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::bind1st(boost::not2(is_equal), "Betty"));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v2.begin(), v2.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::bind2nd(boost::not2(is_equal), "Betty"));
|
||||||
|
|
||||||
|
// pointer_to_unary_function
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v2.begin(), v2.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::not1(boost::ptr_fun(is_betty)));
|
||||||
|
|
||||||
|
// binary_traits, bind1st, bind2nd
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v2.begin(), v2.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::bind1st(is_equal, "Betty"));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v2.begin(), v2.end(),
|
||||||
|
std::ostream_iterator<bool>(std::cout, " "),
|
||||||
|
boost::bind2nd(is_equal, "Betty"));
|
||||||
|
|
||||||
|
// pointer_to_binary_function, bind1st
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(boost::ptr_fun(do_set_name), &person));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(boost::ptr_fun(do_set_name_ref), person));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(boost::ptr_fun(do_set_name_ref), r));
|
||||||
|
|
||||||
|
// binary_traits
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(do_set_name, &person));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(do_set_name_ref, person));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(do_set_name_ref, r));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// const_mem_fun_t
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v3.begin(), v3.end(),
|
||||||
|
std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun(&Person::get_name));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(cv3.begin(), cv3.end(),
|
||||||
|
std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun(&Person::get_name));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v3c.begin(), v3c.end(),
|
||||||
|
std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun(&Person::get_name));
|
||||||
|
|
||||||
|
// const_mem_fun_ref_t
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v1.begin(), v1.end(),
|
||||||
|
std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun_ref(&Person::get_name));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(cv1.begin(), cv1.end(),
|
||||||
|
std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun_ref(&Person::get_name));
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
// const_mem_fun1_t, bind2nd
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v3.begin(), v3.end(), boost::bind2nd(boost::mem_fun(&Person::print), std::cout));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v3.begin(), v3.end(), boost::bind2nd(boost::mem_fun(&Person::print), os));
|
||||||
|
|
||||||
|
// const_mem_fun1_ref_t, bind2nd
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v1.begin(), v1.end(), boost::bind2nd(boost::mem_fun_ref(&Person::print), std::cout));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v1.begin(), v1.end(), boost::bind2nd(boost::mem_fun_ref(&Person::print), os));
|
||||||
|
|
||||||
|
// mem_fun1_t, bind1st
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(boost::mem_fun(&Person::set_name), &person));
|
||||||
|
|
||||||
|
// mem_fun1_ref_t, bind1st
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(boost::mem_fun_ref(&Person::set_name), person));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
std::for_each(v2.begin(), v2.end(), boost::bind1st(boost::mem_fun_ref(&Person::set_name), r));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// mem_fun_t
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v3.begin(), v3.end(), std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun(&Person::clear_name));
|
||||||
|
|
||||||
|
// mem_fun_ref_t
|
||||||
|
std::cout << '\n';
|
||||||
|
std::transform(v1.begin(), v1.end(), std::ostream_iterator<std::string>(std::cout, " "),
|
||||||
|
boost::mem_fun_ref(&Person::clear_name));
|
||||||
|
|
||||||
|
std::cout << '\n';
|
||||||
|
return 0;
|
||||||
|
}
|
535
include/boost/functional.hpp
Normal file
535
include/boost/functional.hpp
Normal file
@ -0,0 +1,535 @@
|
|||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// Boost functional.hpp header file
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2000
|
||||||
|
// Cadenza New Zealand Ltd
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, distribute and sell this software
|
||||||
|
// and its documentation for any purpose is hereby granted without
|
||||||
|
// fee, provided that the above copyright notice appears in all copies
|
||||||
|
// and that both the copyright notice and this permission notice
|
||||||
|
// appear in supporting documentation. Cadenza New Zealand Ltd makes
|
||||||
|
// no representations about the suitability of this software for any
|
||||||
|
// purpose. It is provided "as is" without express or implied
|
||||||
|
// warranty.
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// $Id$
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// $Log$
|
||||||
|
// Revision 1.1.1.1 2000/07/07 16:03:47 beman
|
||||||
|
// 1.16.1 initial CVS checkin
|
||||||
|
//
|
||||||
|
// Revision 1.3 2000/06/26 09:44:54 mark
|
||||||
|
// Updated following feedback from Jens Maurer.
|
||||||
|
//
|
||||||
|
// Revision 1.2 2000/05/17 08:36:30 mark
|
||||||
|
// Fixed problems with function object traits thanks to ideas
|
||||||
|
// from John Maddock.
|
||||||
|
//
|
||||||
|
// Revision 1.1 2000/05/07 08:26:51 mark
|
||||||
|
// Initial revision
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef BOOST_FUNCTIONAL_HPP
|
||||||
|
#define BOOST_FUNCTIONAL_HPP
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/call_traits.hpp>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// The following traits classes allow us to avoid the need for ptr_fun
|
||||||
|
// because the types of arguments and the result of a function can be
|
||||||
|
// deduced.
|
||||||
|
//
|
||||||
|
// In addition to the standard types defined in unary_function and
|
||||||
|
// binary_function, we add
|
||||||
|
//
|
||||||
|
// - function_type, the type of the function or function object itself.
|
||||||
|
//
|
||||||
|
// - param_type, the type that should be used for passing the function or
|
||||||
|
// function object as an argument.
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
template <class Operation>
|
||||||
|
struct unary_traits_imp;
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct unary_traits_imp<Operation*>
|
||||||
|
{
|
||||||
|
typedef Operation function_type;
|
||||||
|
typedef const function_type & param_type;
|
||||||
|
typedef typename Operation::result_type result_type;
|
||||||
|
typedef typename Operation::argument_type argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class R, class A>
|
||||||
|
struct unary_traits_imp<R(*)(A)>
|
||||||
|
{
|
||||||
|
typedef R (*function_type)(A);
|
||||||
|
typedef R (*param_type)(A);
|
||||||
|
typedef R result_type;
|
||||||
|
typedef A argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct binary_traits_imp;
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct binary_traits_imp<Operation*>
|
||||||
|
{
|
||||||
|
typedef Operation function_type;
|
||||||
|
typedef const function_type & param_type;
|
||||||
|
typedef typename Operation::result_type result_type;
|
||||||
|
typedef typename Operation::first_argument_type first_argument_type;
|
||||||
|
typedef typename Operation::second_argument_type second_argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class R, class A1, class A2>
|
||||||
|
struct binary_traits_imp<R(*)(A1,A2)>
|
||||||
|
{
|
||||||
|
typedef R (*function_type)(A1,A2);
|
||||||
|
typedef R (*param_type)(A1,A2);
|
||||||
|
typedef R result_type;
|
||||||
|
typedef A1 first_argument_type;
|
||||||
|
typedef A2 second_argument_type;
|
||||||
|
};
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct unary_traits
|
||||||
|
{
|
||||||
|
typedef typename detail::unary_traits_imp<Operation*>::function_type function_type;
|
||||||
|
typedef typename detail::unary_traits_imp<Operation*>::param_type param_type;
|
||||||
|
typedef typename detail::unary_traits_imp<Operation*>::result_type result_type;
|
||||||
|
typedef typename detail::unary_traits_imp<Operation*>::argument_type argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class R, class A>
|
||||||
|
struct unary_traits<R(*)(A)>
|
||||||
|
{
|
||||||
|
typedef R (*function_type)(A);
|
||||||
|
typedef R (*param_type)(A);
|
||||||
|
typedef R result_type;
|
||||||
|
typedef A argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct binary_traits
|
||||||
|
{
|
||||||
|
typedef typename detail::binary_traits_imp<Operation*>::function_type function_type;
|
||||||
|
typedef typename detail::binary_traits_imp<Operation*>::param_type param_type;
|
||||||
|
typedef typename detail::binary_traits_imp<Operation*>::result_type result_type;
|
||||||
|
typedef typename detail::binary_traits_imp<Operation*>::first_argument_type first_argument_type;
|
||||||
|
typedef typename detail::binary_traits_imp<Operation*>::second_argument_type second_argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class R, class A1, class A2>
|
||||||
|
struct binary_traits<R(*)(A1,A2)>
|
||||||
|
{
|
||||||
|
typedef R (*function_type)(A1,A2);
|
||||||
|
typedef R (*param_type)(A1,A2);
|
||||||
|
typedef R result_type;
|
||||||
|
typedef A1 first_argument_type;
|
||||||
|
typedef A2 second_argument_type;
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// If we have no partial specialisation available, decay to a situation
|
||||||
|
// that is no worse than in the Standard, i.e., ptr_fun will be required.
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct unary_traits
|
||||||
|
{
|
||||||
|
typedef Operation function_type;
|
||||||
|
typedef const Operation& param_type;
|
||||||
|
typedef typename Operation::result_type result_type;
|
||||||
|
typedef typename Operation::argument_type argument_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
struct binary_traits
|
||||||
|
{
|
||||||
|
typedef Operation function_type;
|
||||||
|
typedef const Operation & param_type;
|
||||||
|
typedef typename Operation::result_type result_type;
|
||||||
|
typedef typename Operation::first_argument_type first_argument_type;
|
||||||
|
typedef typename Operation::second_argument_type second_argument_type;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// unary_negate, not1
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class Predicate>
|
||||||
|
class unary_negate
|
||||||
|
: public std::unary_function<typename unary_traits<Predicate>::argument_type,bool>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit unary_negate(typename unary_traits<Predicate>::param_type x)
|
||||||
|
:
|
||||||
|
pred(x)
|
||||||
|
{}
|
||||||
|
bool operator()(typename call_traits<typename unary_traits<Predicate>::argument_type>::param_type x) const
|
||||||
|
{
|
||||||
|
return !pred(x);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
typename unary_traits<Predicate>::function_type pred;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Predicate>
|
||||||
|
unary_negate<Predicate> not1(const Predicate &pred)
|
||||||
|
{
|
||||||
|
// The cast is to placate Borland C++Builder in certain circumstances.
|
||||||
|
// I don't think it should be necessary.
|
||||||
|
return unary_negate<Predicate>((typename unary_traits<Predicate>::param_type)pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// binary_negate, not2
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class Predicate>
|
||||||
|
class binary_negate
|
||||||
|
: public std::binary_function<typename binary_traits<Predicate>::first_argument_type,
|
||||||
|
typename binary_traits<Predicate>::second_argument_type,
|
||||||
|
bool>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit binary_negate(typename binary_traits<Predicate>::param_type x)
|
||||||
|
:
|
||||||
|
pred(x)
|
||||||
|
{}
|
||||||
|
bool operator()(typename call_traits<typename binary_traits<Predicate>::first_argument_type>::param_type x,
|
||||||
|
typename call_traits<typename binary_traits<Predicate>::second_argument_type>::param_type y) const
|
||||||
|
{
|
||||||
|
return !pred(x,y);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
typename binary_traits<Predicate>::function_type pred;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Predicate>
|
||||||
|
binary_negate<Predicate> not2(const Predicate &pred)
|
||||||
|
{
|
||||||
|
// The cast is to placate Borland C++Builder in certain circumstances.
|
||||||
|
// I don't think it should be necessary.
|
||||||
|
return binary_negate<Predicate>((typename binary_traits<Predicate>::param_type)pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// binder1st, bind1st
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class Operation>
|
||||||
|
class binder1st
|
||||||
|
: public std::unary_function<typename binary_traits<Operation>::second_argument_type,
|
||||||
|
typename binary_traits<Operation>::result_type>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
binder1st(typename binary_traits<Operation>::param_type x,
|
||||||
|
typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type y)
|
||||||
|
:
|
||||||
|
op(x), value(y)
|
||||||
|
{}
|
||||||
|
|
||||||
|
typename binary_traits<Operation>::result_type
|
||||||
|
operator()(typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type x) const
|
||||||
|
{
|
||||||
|
return op(value, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typename binary_traits<Operation>::function_type op;
|
||||||
|
typename binary_traits<Operation>::first_argument_type value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
inline binder1st<Operation> bind1st(const Operation &op,
|
||||||
|
typename call_traits<
|
||||||
|
typename binary_traits<Operation>::first_argument_type
|
||||||
|
>::param_type x)
|
||||||
|
{
|
||||||
|
// The cast is to placate Borland C++Builder in certain circumstances.
|
||||||
|
// I don't think it should be necessary.
|
||||||
|
return binder1st<Operation>((typename binary_traits<Operation>::param_type)op, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// binder2nd, bind2nd
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class Operation>
|
||||||
|
class binder2nd
|
||||||
|
: public std::unary_function<typename binary_traits<Operation>::first_argument_type,
|
||||||
|
typename binary_traits<Operation>::result_type>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
binder2nd(typename binary_traits<Operation>::param_type x,
|
||||||
|
typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type y)
|
||||||
|
:
|
||||||
|
op(x), value(y)
|
||||||
|
{}
|
||||||
|
|
||||||
|
typename binary_traits<Operation>::result_type
|
||||||
|
operator()(typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type x) const
|
||||||
|
{
|
||||||
|
return op(x, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typename binary_traits<Operation>::function_type op;
|
||||||
|
typename binary_traits<Operation>::second_argument_type value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
inline binder2nd<Operation> bind2nd(const Operation &op,
|
||||||
|
typename call_traits<
|
||||||
|
typename binary_traits<Operation>::second_argument_type
|
||||||
|
>::param_type x)
|
||||||
|
{
|
||||||
|
// The cast is to placate Borland C++Builder in certain circumstances.
|
||||||
|
// I don't think it should be necessary.
|
||||||
|
return binder2nd<Operation>((typename binary_traits<Operation>::param_type)op, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// mem_fun, etc
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class S, class T>
|
||||||
|
class mem_fun_t : public std::unary_function<T*, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit mem_fun_t(S (T::*p)())
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
S operator()(T* p) const
|
||||||
|
{
|
||||||
|
return (p->*ptr)();
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)();
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class S, class T, class A>
|
||||||
|
class mem_fun1_t : public std::binary_function<T*, A, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit mem_fun1_t(S (T::*p)(A))
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
S operator()(T* p, typename call_traits<A>::param_type x) const
|
||||||
|
{
|
||||||
|
return (p->*ptr)(x);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)(A);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class S, class T>
|
||||||
|
class const_mem_fun_t : public std::unary_function<const T*, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit const_mem_fun_t(S (T::*p)() const)
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
S operator()(const T* p) const
|
||||||
|
{
|
||||||
|
return (p->*ptr)();
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class S, class T, class A>
|
||||||
|
class const_mem_fun1_t : public std::binary_function<const T*, A, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit const_mem_fun1_t(S (T::*p)(A) const)
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
S operator()(const T* p, typename call_traits<A>::param_type x) const
|
||||||
|
{
|
||||||
|
return (p->*ptr)(x);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)(A) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class S, class T>
|
||||||
|
inline mem_fun_t<S,T> mem_fun(S (T::*f)())
|
||||||
|
{
|
||||||
|
return mem_fun_t<S,T>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class S, class T, class A>
|
||||||
|
inline mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A))
|
||||||
|
{
|
||||||
|
return mem_fun1_t<S,T,A>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class S, class T>
|
||||||
|
inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const)
|
||||||
|
{
|
||||||
|
return const_mem_fun_t<S,T>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class S, class T, class A>
|
||||||
|
inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const)
|
||||||
|
{
|
||||||
|
return const_mem_fun1_t<S,T,A>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// mem_fun_ref, etc
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class S, class T>
|
||||||
|
class mem_fun_ref_t : public std::unary_function<T&, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit mem_fun_ref_t(S (T::*p)())
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
S operator()(T& p) const
|
||||||
|
{
|
||||||
|
return (p.*ptr)();
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)();
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class S, class T, class A>
|
||||||
|
class mem_fun1_ref_t : public std::binary_function<T&, A, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit mem_fun1_ref_t(S (T::*p)(A))
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
S operator()(T& p, typename call_traits<A>::param_type x) const
|
||||||
|
{
|
||||||
|
return (p.*ptr)(x);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)(A);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class S, class T>
|
||||||
|
class const_mem_fun_ref_t : public std::unary_function<const T&, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit const_mem_fun_ref_t(S (T::*p)() const)
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
|
||||||
|
S operator()(const T &p) const
|
||||||
|
{
|
||||||
|
return (p.*ptr)();
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class S, class T, class A>
|
||||||
|
class const_mem_fun1_ref_t : public std::binary_function<const T&, A, S>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit const_mem_fun1_ref_t(S (T::*p)(A) const)
|
||||||
|
:
|
||||||
|
ptr(p)
|
||||||
|
{}
|
||||||
|
|
||||||
|
S operator()(const T& p, typename call_traits<A>::param_type x) const
|
||||||
|
{
|
||||||
|
return (p.*ptr)(x);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
S (T::*ptr)(A) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class S, class T>
|
||||||
|
inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)())
|
||||||
|
{
|
||||||
|
return mem_fun_ref_t<S,T>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class S, class T, class A>
|
||||||
|
inline mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A))
|
||||||
|
{
|
||||||
|
return mem_fun1_ref_t<S,T,A>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class S, class T>
|
||||||
|
inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const)
|
||||||
|
{
|
||||||
|
return const_mem_fun_ref_t<S,T>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class S, class T, class A>
|
||||||
|
inline const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const)
|
||||||
|
{
|
||||||
|
return const_mem_fun1_ref_t<S,T,A>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// ptr_fun
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
template <class Arg, class Result>
|
||||||
|
class pointer_to_unary_function : public std::unary_function<Arg,Result>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit pointer_to_unary_function(Result (*f)(Arg))
|
||||||
|
:
|
||||||
|
func(f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Result operator()(typename call_traits<Arg>::param_type x) const
|
||||||
|
{
|
||||||
|
return func(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result (*func)(Arg);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Arg, class Result>
|
||||||
|
inline pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg))
|
||||||
|
{
|
||||||
|
return pointer_to_unary_function<Arg,Result>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Arg1, class Arg2, class Result>
|
||||||
|
class pointer_to_binary_function : public std::binary_function<Arg1,Arg2,Result>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2))
|
||||||
|
:
|
||||||
|
func(f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Result operator()(typename call_traits<Arg1>::param_type x, typename call_traits<Arg2>::param_type y) const
|
||||||
|
{
|
||||||
|
return func(x,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result (*func)(Arg1, Arg2);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Arg1, class Arg2, class Result>
|
||||||
|
inline pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
|
||||||
|
{
|
||||||
|
return pointer_to_binary_function<Arg1,Arg2,Result>(f);
|
||||||
|
}
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
Reference in New Issue
Block a user