mirror of
https://github.com/boostorg/utility.git
synced 2025-07-30 04:47:30 +02:00
Removed part of the Boost files from the SPIRIT_MINIBOOST branch.
[SVN r26367]
This commit is contained in:
@ -1,168 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to the Boost Software License,
|
|
||||||
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt).
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/libs/utility for most recent version including documentation.
|
|
||||||
//
|
|
||||||
// Crippled version for crippled compilers:
|
|
||||||
// see libs/utility/call_traits.htm
|
|
||||||
//
|
|
||||||
|
|
||||||
/* Release notes:
|
|
||||||
01st October 2000:
|
|
||||||
Fixed call_traits on VC6, using "poor man's partial specialisation",
|
|
||||||
using ideas taken from "Generative programming" by Krzysztof Czarnecki
|
|
||||||
& Ulrich Eisenecker.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BOOST_OB_CALL_TRAITS_HPP
|
|
||||||
#define BOOST_OB_CALL_TRAITS_HPP
|
|
||||||
|
|
||||||
#ifndef BOOST_CONFIG_HPP
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP
|
|
||||||
#include <boost/type_traits/arithmetic_traits.hpp>
|
|
||||||
#endif
|
|
||||||
#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP
|
|
||||||
#include <boost/type_traits/composite_traits.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace boost{
|
|
||||||
|
|
||||||
#ifdef BOOST_MSVC6_MEMBER_TEMPLATES
|
|
||||||
//
|
|
||||||
// use member templates to emulate
|
|
||||||
// partial specialisation:
|
|
||||||
//
|
|
||||||
namespace detail{
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct standard_call_traits
|
|
||||||
{
|
|
||||||
typedef T value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T& param_type;
|
|
||||||
};
|
|
||||||
template <class T>
|
|
||||||
struct simple_call_traits
|
|
||||||
{
|
|
||||||
typedef T value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T param_type;
|
|
||||||
};
|
|
||||||
template <class T>
|
|
||||||
struct reference_call_traits
|
|
||||||
{
|
|
||||||
typedef T value_type;
|
|
||||||
typedef T reference;
|
|
||||||
typedef T const_reference;
|
|
||||||
typedef T param_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <bool pointer, bool arithmetic, bool reference>
|
|
||||||
struct call_traits_chooser
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef standard_call_traits<T> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct call_traits_chooser<true, false, false>
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef simple_call_traits<T> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct call_traits_chooser<false, false, true>
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef reference_call_traits<T> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <bool size_is_small>
|
|
||||||
struct call_traits_sizeof_chooser2
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
struct small_rebind
|
|
||||||
{
|
|
||||||
typedef simple_call_traits<T> small_type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct call_traits_sizeof_chooser2<false>
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
struct small_rebind
|
|
||||||
{
|
|
||||||
typedef standard_call_traits<T> small_type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct call_traits_chooser<false, true, false>
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
enum { sizeof_choice = (sizeof(T) <= sizeof(void*)) };
|
|
||||||
typedef call_traits_sizeof_chooser2<(sizeof(T) <= sizeof(void*))> chooser;
|
|
||||||
typedef typename chooser::template small_rebind<T> bound_type;
|
|
||||||
typedef typename bound_type::small_type type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
template <typename T>
|
|
||||||
struct call_traits
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
typedef detail::call_traits_chooser<
|
|
||||||
::boost::is_pointer<T>::value,
|
|
||||||
::boost::is_arithmetic<T>::value,
|
|
||||||
::boost::is_reference<T>::value
|
|
||||||
> chooser;
|
|
||||||
typedef typename chooser::template rebind<T> bound_type;
|
|
||||||
typedef typename bound_type::type call_traits_type;
|
|
||||||
public:
|
|
||||||
typedef typename call_traits_type::value_type value_type;
|
|
||||||
typedef typename call_traits_type::reference reference;
|
|
||||||
typedef typename call_traits_type::const_reference const_reference;
|
|
||||||
typedef typename call_traits_type::param_type param_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
//
|
|
||||||
// sorry call_traits is completely non-functional
|
|
||||||
// blame your broken compiler:
|
|
||||||
//
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct call_traits
|
|
||||||
{
|
|
||||||
typedef T value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T& param_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // member templates
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // BOOST_OB_CALL_TRAITS_HPP
|
|
@ -1,510 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to the Boost Software License,
|
|
||||||
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt).
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/libs/utility for most recent version including documentation.
|
|
||||||
// see libs/utility/compressed_pair.hpp
|
|
||||||
//
|
|
||||||
/* Release notes:
|
|
||||||
20 Jan 2001:
|
|
||||||
Fixed obvious bugs (David Abrahams)
|
|
||||||
07 Oct 2000:
|
|
||||||
Added better single argument constructor support.
|
|
||||||
03 Oct 2000:
|
|
||||||
Added VC6 support (JM).
|
|
||||||
23rd July 2000:
|
|
||||||
Additional comments added. (JM)
|
|
||||||
Jan 2000:
|
|
||||||
Original version: this version crippled for use with crippled compilers
|
|
||||||
- John Maddock Jan 2000.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef BOOST_OB_COMPRESSED_PAIR_HPP
|
|
||||||
#define BOOST_OB_COMPRESSED_PAIR_HPP
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP
|
|
||||||
#include <boost/type_traits/object_traits.hpp>
|
|
||||||
#endif
|
|
||||||
#ifndef BOOST_SAME_TRAITS_HPP
|
|
||||||
#include <boost/type_traits/same_traits.hpp>
|
|
||||||
#endif
|
|
||||||
#ifndef BOOST_CALL_TRAITS_HPP
|
|
||||||
#include <boost/call_traits.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
#ifdef BOOST_MSVC6_MEMBER_TEMPLATES
|
|
||||||
//
|
|
||||||
// use member templates to emulate
|
|
||||||
// partial specialisation. Note that due to
|
|
||||||
// problems with overload resolution with VC6
|
|
||||||
// each of the compressed_pair versions that follow
|
|
||||||
// have one template single-argument constructor
|
|
||||||
// in place of two specific constructors:
|
|
||||||
//
|
|
||||||
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair;
|
|
||||||
|
|
||||||
namespace detail{
|
|
||||||
|
|
||||||
template <class A, class T1, class T2>
|
|
||||||
struct best_conversion_traits
|
|
||||||
{
|
|
||||||
typedef char one;
|
|
||||||
typedef char (&two)[2];
|
|
||||||
static A a;
|
|
||||||
static one test(T1);
|
|
||||||
static two test(T2);
|
|
||||||
|
|
||||||
enum { value = sizeof(test(a)) };
|
|
||||||
};
|
|
||||||
|
|
||||||
template <int>
|
|
||||||
struct init_one;
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct init_one<1>
|
|
||||||
{
|
|
||||||
template <class A, class T1, class T2>
|
|
||||||
static void init(const A& a, T1* p1, T2*)
|
|
||||||
{
|
|
||||||
*p1 = a;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct init_one<2>
|
|
||||||
{
|
|
||||||
template <class A, class T1, class T2>
|
|
||||||
static void init(const A& a, T1*, T2* p2)
|
|
||||||
{
|
|
||||||
*p2 = a;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// T1 != T2, both non-empty
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair_0
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T1 _first;
|
|
||||||
T2 _second;
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair_0() : _first(), _second() {}
|
|
||||||
compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {}
|
|
||||||
template <class A>
|
|
||||||
explicit compressed_pair_0(const A& val)
|
|
||||||
{
|
|
||||||
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, &_second);
|
|
||||||
}
|
|
||||||
compressed_pair_0(const ::boost::compressed_pair<T1,T2>& x)
|
|
||||||
: _first(x.first()), _second(x.second()) {}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
compressed_pair_0& operator=(const compressed_pair_0& x) {
|
|
||||||
cout << "assigning compressed pair 0" << endl;
|
|
||||||
_first = x._first;
|
|
||||||
_second = x._second;
|
|
||||||
cout << "finished assigning compressed pair 0" << endl;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
first_reference first() { return _first; }
|
|
||||||
first_const_reference first() const { return _first; }
|
|
||||||
|
|
||||||
second_reference second() { return _second; }
|
|
||||||
second_const_reference second() const { return _second; }
|
|
||||||
|
|
||||||
void swap(compressed_pair_0& y)
|
|
||||||
{
|
|
||||||
using std::swap;
|
|
||||||
swap(_first, y._first);
|
|
||||||
swap(_second, y._second);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// T1 != T2, T2 empty
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair_1 : T2
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T1 _first;
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair_1() : T2(), _first() {}
|
|
||||||
compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {}
|
|
||||||
|
|
||||||
template <class A>
|
|
||||||
explicit compressed_pair_1(const A& val)
|
|
||||||
{
|
|
||||||
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, static_cast<T2*>(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
compressed_pair_1(const ::boost::compressed_pair<T1,T2>& x)
|
|
||||||
: T2(x.second()), _first(x.first()) {}
|
|
||||||
|
|
||||||
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
|
|
||||||
// Total weirdness. If the assignment to _first is moved after
|
|
||||||
// the call to the inherited operator=, then this breaks graph/test/graph.cpp
|
|
||||||
// by way of iterator_adaptor.
|
|
||||||
compressed_pair_1& operator=(const compressed_pair_1& x) {
|
|
||||||
_first = x._first;
|
|
||||||
T2::operator=(x);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
first_reference first() { return _first; }
|
|
||||||
first_const_reference first() const { return _first; }
|
|
||||||
|
|
||||||
second_reference second() { return *this; }
|
|
||||||
second_const_reference second() const { return *this; }
|
|
||||||
|
|
||||||
void swap(compressed_pair_1& y)
|
|
||||||
{
|
|
||||||
// no need to swap empty base class:
|
|
||||||
using std::swap;
|
|
||||||
swap(_first, y._first);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// T1 != T2, T1 empty
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair_2 : T1
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T2 _second;
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair_2() : T1(), _second() {}
|
|
||||||
compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {}
|
|
||||||
template <class A>
|
|
||||||
explicit compressed_pair_2(const A& val)
|
|
||||||
{
|
|
||||||
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), &_second);
|
|
||||||
}
|
|
||||||
compressed_pair_2(const ::boost::compressed_pair<T1,T2>& x)
|
|
||||||
: T1(x.first()), _second(x.second()) {}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
compressed_pair_2& operator=(const compressed_pair_2& x) {
|
|
||||||
cout << "assigning compressed pair 2" << endl;
|
|
||||||
T1::operator=(x);
|
|
||||||
_second = x._second;
|
|
||||||
cout << "finished assigning compressed pair 2" << endl;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
first_reference first() { return *this; }
|
|
||||||
first_const_reference first() const { return *this; }
|
|
||||||
|
|
||||||
second_reference second() { return _second; }
|
|
||||||
second_const_reference second() const { return _second; }
|
|
||||||
|
|
||||||
void swap(compressed_pair_2& y)
|
|
||||||
{
|
|
||||||
// no need to swap empty base class:
|
|
||||||
using std::swap;
|
|
||||||
swap(_second, y._second);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// T1 != T2, both empty
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair_3 : T1, T2
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair_3() : T1(), T2() {}
|
|
||||||
compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {}
|
|
||||||
template <class A>
|
|
||||||
explicit compressed_pair_3(const A& val)
|
|
||||||
{
|
|
||||||
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), static_cast<T2*>(this));
|
|
||||||
}
|
|
||||||
compressed_pair_3(const ::boost::compressed_pair<T1,T2>& x)
|
|
||||||
: T1(x.first()), T2(x.second()) {}
|
|
||||||
|
|
||||||
first_reference first() { return *this; }
|
|
||||||
first_const_reference first() const { return *this; }
|
|
||||||
|
|
||||||
second_reference second() { return *this; }
|
|
||||||
second_const_reference second() const { return *this; }
|
|
||||||
|
|
||||||
void swap(compressed_pair_3& y)
|
|
||||||
{
|
|
||||||
// no need to swap empty base classes:
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// T1 == T2, and empty
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair_4 : T1
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair_4() : T1() {}
|
|
||||||
compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {}
|
|
||||||
// only one single argument constructor since T1 == T2
|
|
||||||
explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {}
|
|
||||||
compressed_pair_4(const ::boost::compressed_pair<T1,T2>& x)
|
|
||||||
: T1(x.first()), m_second(x.second()) {}
|
|
||||||
|
|
||||||
first_reference first() { return *this; }
|
|
||||||
first_const_reference first() const { return *this; }
|
|
||||||
|
|
||||||
second_reference second() { return m_second; }
|
|
||||||
second_const_reference second() const { return m_second; }
|
|
||||||
|
|
||||||
void swap(compressed_pair_4& y)
|
|
||||||
{
|
|
||||||
// no need to swap empty base classes:
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
T2 m_second;
|
|
||||||
};
|
|
||||||
|
|
||||||
// T1 == T2, not empty
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair_5
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T1 _first;
|
|
||||||
T2 _second;
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair_5() : _first(), _second() {}
|
|
||||||
compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {}
|
|
||||||
// only one single argument constructor since T1 == T2
|
|
||||||
explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {}
|
|
||||||
compressed_pair_5(const ::boost::compressed_pair<T1,T2>& c)
|
|
||||||
: _first(c.first()), _second(c.second()) {}
|
|
||||||
|
|
||||||
first_reference first() { return _first; }
|
|
||||||
first_const_reference first() const { return _first; }
|
|
||||||
|
|
||||||
second_reference second() { return _second; }
|
|
||||||
second_const_reference second() const { return _second; }
|
|
||||||
|
|
||||||
void swap(compressed_pair_5& y)
|
|
||||||
{
|
|
||||||
using std::swap;
|
|
||||||
swap(_first, y._first);
|
|
||||||
swap(_second, y._second);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <bool e1, bool e2, bool same>
|
|
||||||
struct compressed_pair_chooser
|
|
||||||
{
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef compressed_pair_0<T1, T2> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct compressed_pair_chooser<false, true, false>
|
|
||||||
{
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef compressed_pair_1<T1, T2> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct compressed_pair_chooser<true, false, false>
|
|
||||||
{
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef compressed_pair_2<T1, T2> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct compressed_pair_chooser<true, true, false>
|
|
||||||
{
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef compressed_pair_3<T1, T2> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct compressed_pair_chooser<true, true, true>
|
|
||||||
{
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef compressed_pair_4<T1, T2> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct compressed_pair_chooser<false, false, true>
|
|
||||||
{
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
typedef compressed_pair_5<T1, T2> type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T1, class T2>
|
|
||||||
struct compressed_pair_traits
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
typedef compressed_pair_chooser<is_empty<T1>::value, is_empty<T2>::value, is_same<T1,T2>::value> chooser;
|
|
||||||
typedef typename chooser::template rebind<T1, T2> bound_type;
|
|
||||||
public:
|
|
||||||
typedef typename bound_type::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair : public detail::compressed_pair_traits<T1, T2>::type
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
typedef typename detail::compressed_pair_traits<T1, T2>::type base_type;
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair() : base_type() {}
|
|
||||||
compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {}
|
|
||||||
template <class A>
|
|
||||||
explicit compressed_pair(const A& x) : base_type(x){}
|
|
||||||
|
|
||||||
first_reference first() { return base_type::first(); }
|
|
||||||
first_const_reference first() const { return base_type::first(); }
|
|
||||||
|
|
||||||
second_reference second() { return base_type::second(); }
|
|
||||||
second_const_reference second() const { return base_type::second(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T1, class T2>
|
|
||||||
inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
|
|
||||||
{
|
|
||||||
x.swap(y);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
// no partial specialisation, no member templates:
|
|
||||||
|
|
||||||
template <class T1, class T2>
|
|
||||||
class compressed_pair
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
T1 _first;
|
|
||||||
T2 _second;
|
|
||||||
public:
|
|
||||||
typedef T1 first_type;
|
|
||||||
typedef T2 second_type;
|
|
||||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
|
||||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
|
||||||
typedef typename call_traits<first_type>::reference first_reference;
|
|
||||||
typedef typename call_traits<second_type>::reference second_reference;
|
|
||||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
|
||||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
|
||||||
|
|
||||||
compressed_pair() : _first(), _second() {}
|
|
||||||
compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {}
|
|
||||||
explicit compressed_pair(first_param_type x) : _first(x), _second() {}
|
|
||||||
// can't define this in case T1 == T2:
|
|
||||||
// explicit compressed_pair(second_param_type y) : _first(), _second(y) {}
|
|
||||||
|
|
||||||
first_reference first() { return _first; }
|
|
||||||
first_const_reference first() const { return _first; }
|
|
||||||
|
|
||||||
second_reference second() { return _second; }
|
|
||||||
second_const_reference second() const { return _second; }
|
|
||||||
|
|
||||||
void swap(compressed_pair& y)
|
|
||||||
{
|
|
||||||
using std::swap;
|
|
||||||
swap(_first, y._first);
|
|
||||||
swap(_second, y._second);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T1, class T2>
|
|
||||||
inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
|
|
||||||
{
|
|
||||||
x.swap(y);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // boost
|
|
||||||
|
|
||||||
#endif // BOOST_OB_COMPRESSED_PAIR_HPP
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
|||||||
// boost utility/base_from_member.hpp header file --------------------------//
|
|
||||||
|
|
||||||
// Copyright 2001, 2003, 2004 Daryle Walker. Use, modification, and
|
|
||||||
// distribution are subject to the Boost Software License, Version 1.0. (See
|
|
||||||
// accompanying file LICENSE_1_0.txt or a copy at
|
|
||||||
// <http://www.boost.org/LICENSE_1_0.txt>.)
|
|
||||||
|
|
||||||
// See <http://www.boost.org/libs/utility/> for the library's home page.
|
|
||||||
|
|
||||||
#ifndef BOOST_UTILITY_BASE_FROM_MEMBER_HPP
|
|
||||||
#define BOOST_UTILITY_BASE_FROM_MEMBER_HPP
|
|
||||||
|
|
||||||
#include <boost/preprocessor/arithmetic/inc.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
// Base-from-member arity configuration macro ------------------------------//
|
|
||||||
|
|
||||||
// The following macro determines how many arguments will be in the largest
|
|
||||||
// constructor template of base_from_member. Constructor templates will be
|
|
||||||
// generated from one argument to this maximum. Code from other files can read
|
|
||||||
// this number if they need to always match the exact maximum base_from_member
|
|
||||||
// uses. The maximum constructor length can be changed by overriding the
|
|
||||||
// #defined constant. Make sure to apply the override, if any, for all source
|
|
||||||
// files during project compiling for consistency.
|
|
||||||
|
|
||||||
// Contributed by Jonathan Turkanis
|
|
||||||
|
|
||||||
#ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY
|
|
||||||
#define BOOST_BASE_FROM_MEMBER_MAX_ARITY 10
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// An iteration of a constructor template for base_from_member -------------//
|
|
||||||
|
|
||||||
// A macro that should expand to:
|
|
||||||
// template < typename T1, ..., typename Tn >
|
|
||||||
// base_from_member( T1 x1, ..., Tn xn )
|
|
||||||
// : member( x1, ..., xn )
|
|
||||||
// {}
|
|
||||||
// This macro should only persist within this file.
|
|
||||||
|
|
||||||
#define BOOST_PRIVATE_CTR_DEF( z, n, data ) \
|
|
||||||
template < BOOST_PP_ENUM_PARAMS(n, typename T) > \
|
|
||||||
explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \
|
|
||||||
: member( BOOST_PP_ENUM_PARAMS(n, x) ) \
|
|
||||||
{} \
|
|
||||||
/**/
|
|
||||||
|
|
||||||
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
|
|
||||||
// Base-from-member class template -----------------------------------------//
|
|
||||||
|
|
||||||
// Helper to initialize a base object so a derived class can use this
|
|
||||||
// object in the initialization of another base class. Used by
|
|
||||||
// Dietmar Kuehl from ideas by Ron Klatcho to solve the problem of a
|
|
||||||
// base class needing to be initialized by a member.
|
|
||||||
|
|
||||||
// Contributed by Daryle Walker
|
|
||||||
|
|
||||||
template < typename MemberType, int UniqueID = 0 >
|
|
||||||
class base_from_member
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
MemberType member;
|
|
||||||
|
|
||||||
base_from_member()
|
|
||||||
: member()
|
|
||||||
{}
|
|
||||||
|
|
||||||
BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY),
|
|
||||||
BOOST_PRIVATE_CTR_DEF, _ )
|
|
||||||
|
|
||||||
}; // boost::base_from_member
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
|
|
||||||
// Undo any private macros
|
|
||||||
#undef BOOST_PRIVATE_CTR_DEF
|
|
||||||
|
|
||||||
|
|
||||||
#endif // BOOST_UTILITY_BASE_FROM_MEMBER_HPP
|
|
@ -1,33 +0,0 @@
|
|||||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
|
|
||||||
//
|
|
||||||
// Use, modification, and distribution is subject to the Boost Software
|
|
||||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/lib/optional for documentation.
|
|
||||||
//
|
|
||||||
// You are welcome to contact the author at:
|
|
||||||
// fernando_cacciola@hotmail.com
|
|
||||||
//
|
|
||||||
#ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_25AGO2003_HPP
|
|
||||||
#define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_25AGO2003_HPP
|
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/enum.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
|
|
||||||
#include <boost/preprocessor/cat.hpp>
|
|
||||||
#include <boost/preprocessor/arithmetic/inc.hpp>
|
|
||||||
#include <boost/preprocessor/punctuation/paren.hpp>
|
|
||||||
#include <boost/preprocessor/facilities/empty.hpp>
|
|
||||||
|
|
||||||
#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT(z,n,_) BOOST_PP_CAT(m_a,n) BOOST_PP_LPAREN() BOOST_PP_CAT(a,n) BOOST_PP_RPAREN()
|
|
||||||
#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL(z,n,_) BOOST_PP_CAT(A,n) const& BOOST_PP_CAT(m_a,n);
|
|
||||||
#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_ARG(z,n,_) BOOST_PP_CAT(m_a,n)
|
|
||||||
|
|
||||||
#define BOOST_MAX_INPLACE_FACTORY_ARITY 10
|
|
||||||
|
|
||||||
#undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_25AGO2003_HPP
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
|
|
||||||
//
|
|
||||||
// Use, modification, and distribution is subject to the Boost Software
|
|
||||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/lib/optional for documentation.
|
|
||||||
//
|
|
||||||
// You are welcome to contact the author at:
|
|
||||||
// fernando_cacciola@hotmail.com
|
|
||||||
//
|
|
||||||
#ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_25AGO2003_HPP
|
|
||||||
#define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_25AGO2003_HPP
|
|
||||||
|
|
||||||
#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT
|
|
||||||
#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL
|
|
||||||
#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_ARG
|
|
||||||
#undef BOOST_MAX_INPLACE_FACTORY_ARITY
|
|
||||||
|
|
||||||
#undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_25AGO2003_HPP
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
|||||||
// Boost result_of library
|
|
||||||
|
|
||||||
// Copyright Douglas Gregor 2004. Use, modification and
|
|
||||||
// distribution is subject to the Boost Software License, Version
|
|
||||||
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
// For more information, see http://www.boost.org/libs/utility
|
|
||||||
#if !defined(BOOST_PP_IS_ITERATING)
|
|
||||||
# error Boost result_of - do not include this file!
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// CWPro8 requires an argument in a function type specialization
|
|
||||||
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
|
|
||||||
# define BOOST_RESULT_OF_ARGS void
|
|
||||||
#else
|
|
||||||
# define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
|
||||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<F(BOOST_RESULT_OF_ARGS)>
|
|
||||||
: detail::result_of<F, F(BOOST_RESULT_OF_ARGS)> {};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<R (*)(BOOST_RESULT_OF_ARGS), FArgs>
|
|
||||||
{
|
|
||||||
typedef R type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<R (&)(BOOST_RESULT_OF_ARGS), FArgs>
|
|
||||||
{
|
|
||||||
typedef R type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef BOOST_RESULT_OF_ARGS
|
|
||||||
|
|
||||||
#if BOOST_PP_ITERATION() > 1 && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
|
||||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<R (T0::*)
|
|
||||||
(BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
|
|
||||||
FArgs>
|
|
||||||
{
|
|
||||||
typedef R type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<R (T0::*)
|
|
||||||
(BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
|
|
||||||
const,
|
|
||||||
FArgs>
|
|
||||||
{
|
|
||||||
typedef R type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<R (T0::*)
|
|
||||||
(BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
|
|
||||||
volatile,
|
|
||||||
FArgs>
|
|
||||||
{
|
|
||||||
typedef R type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
|
||||||
struct result_of<R (T0::*)
|
|
||||||
(BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
|
|
||||||
const volatile,
|
|
||||||
FArgs>
|
|
||||||
{
|
|
||||||
typedef R type;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
|
|
||||||
//
|
|
||||||
// Use, modification, and distribution is subject to the Boost Software
|
|
||||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/lib/optional for documentation.
|
|
||||||
//
|
|
||||||
// You are welcome to contact the author at:
|
|
||||||
// fernando_cacciola@hotmail.com
|
|
||||||
//
|
|
||||||
#ifndef BOOST_UTILITY_INPLACE_FACTORY_25AGO2003_HPP
|
|
||||||
#define BOOST_UTILITY_INPLACE_FACTORY_25AGO2003_HPP
|
|
||||||
|
|
||||||
#include <boost/utility/detail/in_place_factory_prefix.hpp>
|
|
||||||
|
|
||||||
#include <boost/type.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
class in_place_factory_base {} ;
|
|
||||||
|
|
||||||
#define BOOST_DEFINE_INPLACE_FACTORY_CLASS(z,n,_) \
|
|
||||||
template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \
|
|
||||||
class BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) : public in_place_factory_base \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
\
|
|
||||||
BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A,const& a) ) \
|
|
||||||
: \
|
|
||||||
BOOST_PP_ENUM( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _ ) \
|
|
||||||
{} \
|
|
||||||
\
|
|
||||||
template<class T> \
|
|
||||||
void apply ( void* address BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T) ) const \
|
|
||||||
{ \
|
|
||||||
new ( address ) T ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), m_a ) ) ; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
BOOST_PP_REPEAT( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _) \
|
|
||||||
} ; \
|
|
||||||
\
|
|
||||||
template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \
|
|
||||||
BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) < BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \
|
|
||||||
in_place ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A, const& a) ) \
|
|
||||||
{ \
|
|
||||||
return BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) < BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \
|
|
||||||
( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), a ) ) ; \
|
|
||||||
} ; \
|
|
||||||
|
|
||||||
BOOST_PP_REPEAT( BOOST_MAX_INPLACE_FACTORY_ARITY, BOOST_DEFINE_INPLACE_FACTORY_CLASS, BOOST_PP_EMPTY() )
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#include <boost/utility/detail/in_place_factory_suffix.hpp>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
// Boost result_of library
|
|
||||||
|
|
||||||
// Copyright Douglas Gregor 2004. Use, modification and
|
|
||||||
// distribution is subject to the Boost Software License, Version
|
|
||||||
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
// For more information, see http://www.boost.org/libs/utility
|
|
||||||
#ifndef BOOST_RESULT_OF_HPP
|
|
||||||
#define BOOST_RESULT_OF_HPP
|
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/type_traits/ice.hpp>
|
|
||||||
#include <boost/type.hpp>
|
|
||||||
#include <boost/preprocessor.hpp>
|
|
||||||
#include <boost/detail/workaround.hpp>
|
|
||||||
#include <boost/mpl/has_xxx.hpp>
|
|
||||||
|
|
||||||
#ifndef BOOST_RESULT_OF_NUM_ARGS
|
|
||||||
# define BOOST_RESULT_OF_NUM_ARGS 10
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
template<typename F> struct result_of;
|
|
||||||
|
|
||||||
#if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
|
|
||||||
|
|
||||||
template<typename F, typename FArgs, bool HasResultType> struct get_result_of;
|
|
||||||
|
|
||||||
template<typename F, typename FArgs>
|
|
||||||
struct get_result_of<F, FArgs, true>
|
|
||||||
{
|
|
||||||
typedef typename F::result_type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename F, typename FArgs>
|
|
||||||
struct get_result_of<F, FArgs, false>
|
|
||||||
{
|
|
||||||
typedef typename F::template result<FArgs>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename F>
|
|
||||||
struct get_result_of<F, F(void), false>
|
|
||||||
{
|
|
||||||
typedef void type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename F, typename FArgs>
|
|
||||||
struct result_of : get_result_of<F, FArgs, (has_result_type<F>::value)> {};
|
|
||||||
|
|
||||||
} // end namespace detail
|
|
||||||
|
|
||||||
#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,BOOST_RESULT_OF_NUM_ARGS,<boost/utility/detail/result_of_iterate.hpp>))
|
|
||||||
#include BOOST_PP_ITERATE()
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
# error Your compiler cannot support class template result_of
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // BOOST_RESULT_OF_HPP
|
|
@ -1,57 +0,0 @@
|
|||||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
|
|
||||||
//
|
|
||||||
// Use, modification, and distribution is subject to the Boost Software
|
|
||||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/lib/optional for documentation.
|
|
||||||
//
|
|
||||||
// You are welcome to contact the author at:
|
|
||||||
// fernando_cacciola@hotmail.com
|
|
||||||
//
|
|
||||||
#ifndef BOOST_UTILITY_TYPED_INPLACE_FACTORY_25AGO2003_HPP
|
|
||||||
#define BOOST_UTILITY_TYPED_INPLACE_FACTORY_25AGO2003_HPP
|
|
||||||
|
|
||||||
#include <boost/utility/detail/in_place_factory_prefix.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
class typed_in_place_factory_base {} ;
|
|
||||||
|
|
||||||
#define BOOST_DEFINE_TYPED_INPLACE_FACTORY_CLASS(z,n,_) \
|
|
||||||
template< class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \
|
|
||||||
class BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) : public typed_in_place_factory_base \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
\
|
|
||||||
typedef T value_type ; \
|
|
||||||
\
|
|
||||||
BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A,const& a) ) \
|
|
||||||
: \
|
|
||||||
BOOST_PP_ENUM( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _ ) \
|
|
||||||
{} \
|
|
||||||
\
|
|
||||||
void apply ( void* address ) const \
|
|
||||||
{ \
|
|
||||||
new ( address ) T ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), m_a ) ) ; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
BOOST_PP_REPEAT( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _) \
|
|
||||||
} ; \
|
|
||||||
\
|
|
||||||
template< class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \
|
|
||||||
BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) < T , BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \
|
|
||||||
in_place ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A, const& a) ) \
|
|
||||||
{ \
|
|
||||||
return BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) < T, BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \
|
|
||||||
( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), a ) ) ; \
|
|
||||||
} ; \
|
|
||||||
|
|
||||||
BOOST_PP_REPEAT( BOOST_MAX_INPLACE_FACTORY_ARITY, BOOST_DEFINE_TYPED_INPLACE_FACTORY_CLASS, BOOST_PP_EMPTY() )
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#include <boost/utility/detail/in_place_factory_suffix.hpp>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
Reference in New Issue
Block a user