diff --git a/include/boost/tuple/detail/tuple_basic.hpp b/include/boost/tuple/detail/tuple_basic.hpp deleted file mode 100644 index a1d3284..0000000 --- a/include/boost/tuple/detail/tuple_basic.hpp +++ /dev/null @@ -1,944 +0,0 @@ -// tuple_basic.hpp ----------------------------------------------------- - -// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) -// -// Distributed under 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 - -// Outside help: -// This and that, Gary Powell. -// Fixed return types for get_head/get_tail -// ( and other bugs ) per suggestion of Jens Maurer -// simplified element type accessors + bug fix (Jeremy Siek) -// Several changes/additions according to suggestions by Douglas Gregor, -// William Kempf, Vesa Karvonen, John Max Skaller, Ed Brey, Beman Dawes, -// David Abrahams. - -// Revision history: -// 2002 05 01 Hugo Duncan: Fix for Borland after Jaakko's previous changes -// 2002 04 18 Jaakko: tuple element types can be void or plain function -// types, as long as no object is created. -// Tuple objects can no hold even noncopyable types -// such as arrays. -// 2001 10 22 John Maddock -// Fixes for Borland C++ -// 2001 08 30 David Abrahams -// Added default constructor for cons<>. -// ----------------------------------------------------------------- - -#ifndef BOOST_TUPLE_BASIC_HPP -#define BOOST_TUPLE_BASIC_HPP - - -#include // needed for the assignment from pair to tuple - -#include "boost/type_traits/cv_traits.hpp" -#include "boost/type_traits/function_traits.hpp" - -#include "boost/detail/workaround.hpp" // needed for BOOST_WORKAROUND - -namespace boost { -namespace tuples { - -// -- null_type -------------------------------------------------------- -struct null_type {}; - -// a helper function to provide a const null_type type temporary -namespace detail { - inline const null_type cnull() { return null_type(); } - - -// -- if construct ------------------------------------------------ -// Proposed by Krzysztof Czarnecki and Ulrich Eisenecker - -template struct IF { typedef Then RET; }; - -template struct IF { - typedef Else RET; -}; - -} // end detail - -// - cons forward declaration ----------------------------------------------- -template struct cons; - - -// - tuple forward declaration ----------------------------------------------- -template < - class T0 = null_type, class T1 = null_type, class T2 = null_type, - class T3 = null_type, class T4 = null_type, class T5 = null_type, - class T6 = null_type, class T7 = null_type, class T8 = null_type, - class T9 = null_type> -class tuple; - -// tuple_length forward declaration -template struct length; - - - -namespace detail { - -// -- generate error template, referencing to non-existing members of this -// template is used to produce compilation errors intentionally -template -class generate_error; - -// - cons getters -------------------------------------------------------- -// called: get_class::get(aTuple) - -template< int N > -struct get_class { - template - inline static RET get(const cons& t) - { -#if BOOST_WORKAROUND(__IBMCPP__,==600) - // vacpp 6.0 is not very consistent regarding the member template keyword - // Here it generates an error when the template keyword is used. - return get_class::get(t.tail); -#else - return get_class::BOOST_NESTED_TEMPLATE get(t.tail); -#endif - } - template - inline static RET get(cons& t) - { -#if BOOST_WORKAROUND(__IBMCPP__,==600) - return get_class::get(t.tail); -#else - return get_class::BOOST_NESTED_TEMPLATE get(t.tail); -#endif - } -}; - -template<> -struct get_class<0> { - template - inline static RET get(const cons& t) - { - return t.head; - } - template - inline static RET get(cons& t) - { - return t.head; - } -}; - -} // end of namespace detail - - -// -cons type accessors ---------------------------------------- -// typename tuples::element::type gets the type of the -// Nth element ot T, first element is at index 0 -// ------------------------------------------------------- - -#ifndef BOOST_NO_CV_SPECIALIZATIONS - -template -struct element -{ -private: - typedef typename T::tail_type Next; -public: - typedef typename element::type type; -}; -template -struct element<0,T> -{ - typedef typename T::head_type type; -}; - -template -struct element -{ -private: - typedef typename T::tail_type Next; - typedef typename element::type unqualified_type; -public: -#if BOOST_WORKAROUND(__BORLANDC__,<0x600) - typedef const unqualified_type type; -#else - typedef typename boost::add_const::type type; -#endif - -}; -template -struct element<0,const T> -{ -#if BOOST_WORKAROUND(__BORLANDC__,<0x600) - typedef const typename T::head_type type; -#else - typedef typename boost::add_const::type type; -#endif -}; - -#else // def BOOST_NO_CV_SPECIALIZATIONS - -namespace detail { - -template -struct element_impl -{ -private: - typedef typename T::tail_type Next; -public: - typedef typename element_impl::type type; -}; - -template -struct element_impl -{ -private: - typedef typename T::tail_type Next; -public: - typedef const typename element_impl::type type; -}; - -template -struct element_impl<0, T, false /* IsConst */> -{ - typedef typename T::head_type type; -}; - -template -struct element_impl<0, T, true /* IsConst */> -{ - typedef const typename T::head_type type; -}; - -} // end of namespace detail - - -template -struct element: - public detail::element_impl::value> -{ -}; - -#endif - - -// -get function templates ----------------------------------------------- -// Usage: get(aTuple) - -// -- some traits classes for get functions - -// access traits lifted from detail namespace to be part of the interface, -// (Joel de Guzman's suggestion). Rationale: get functions are part of the -// interface, so should the way to express their return types be. - -template struct access_traits { - typedef const T& const_type; - typedef T& non_const_type; - - typedef const typename boost::remove_cv::type& parameter_type; - -// used as the tuple constructors parameter types -// Rationale: non-reference tuple element types can be cv-qualified. -// It should be possible to initialize such types with temporaries, -// and when binding temporaries to references, the reference must -// be non-volatile and const. 8.5.3. (5) -}; - -template struct access_traits { - - typedef T& const_type; - typedef T& non_const_type; - - typedef T& parameter_type; -}; - -// get function for non-const cons-lists, returns a reference to the element - -template -inline typename access_traits< - typename element >::type - >::non_const_type -get(cons& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { -#if BOOST_WORKAROUND(__IBMCPP__,==600 ) - return detail::get_class:: -#else - return detail::get_class::BOOST_NESTED_TEMPLATE -#endif - get< - typename access_traits< - typename element >::type - >::non_const_type, - HT,TT - >(c); -} - -// get function for const cons-lists, returns a const reference to -// the element. If the element is a reference, returns the reference -// as such (that is, can return a non-const reference) -template -inline typename access_traits< - typename element >::type - >::const_type -get(const cons& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { -#if BOOST_WORKAROUND(__IBMCPP__,==600) - return detail::get_class:: -#else - return detail::get_class::BOOST_NESTED_TEMPLATE -#endif - get< - typename access_traits< - typename element >::type - >::const_type, - HT,TT - >(c); -} - -// -- the cons template -------------------------------------------------- -namespace detail { - -// These helper templates wrap void types and plain function types. -// The reationale is to allow one to write tuple types with those types -// as elements, even though it is not possible to instantiate such object. -// E.g: typedef tuple some_type; // ok -// but: some_type x; // fails - -template class non_storeable_type { - non_storeable_type(); -}; - -template struct wrap_non_storeable_type { - typedef typename IF< - ::boost::is_function::value, non_storeable_type, T - >::RET type; -}; -template <> struct wrap_non_storeable_type { - typedef non_storeable_type type; -}; - -} // detail - -template -struct cons { - - typedef HT head_type; - typedef TT tail_type; - - typedef typename - detail::wrap_non_storeable_type::type stored_head_type; - - stored_head_type head; - tail_type tail; - - typename access_traits::non_const_type - get_head() { return head; } - - typename access_traits::non_const_type - get_tail() { return tail; } - - typename access_traits::const_type - get_head() const { return head; } - - typename access_traits::const_type - get_tail() const { return tail; } - - cons() : head(), tail() {} - // cons() : head(detail::default_arg::f()), tail() {} - - // the argument for head is not strictly needed, but it prevents - // array type elements. This is good, since array type elements - // cannot be supported properly in any case (no assignment, - // copy works only if the tails are exactly the same type, ...) - - cons(typename access_traits::parameter_type h, - const tail_type& t) - : head (h), tail(t) {} - - template - cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, - T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) - : head (t1), - tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull()) - {} - - template - cons( const null_type& t1, T2& t2, T3& t3, T4& t4, T5& t5, - T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) - : head (), - tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull()) - {} - - - template - cons( const cons& u ) : head(u.head), tail(u.tail) {} - - template - cons& operator=( const cons& u ) { - head=u.head; tail=u.tail; return *this; - } - - // must define assignment operator explicitly, implicit version is - // illformed if HT is a reference (12.8. (12)) - cons& operator=(const cons& u) { - head = u.head; tail = u.tail; return *this; - } - - template - cons& operator=( const std::pair& u ) { - BOOST_STATIC_ASSERT(length::value == 2); // check length = 2 - head = u.first; tail.head = u.second; return *this; - } - - // get member functions (non-const and const) - template - typename access_traits< - typename element >::type - >::non_const_type - get() { - return boost::tuples::get(*this); // delegate to non-member get - } - - template - typename access_traits< - typename element >::type - >::const_type - get() const { - return boost::tuples::get(*this); // delegate to non-member get - } -}; - -template -struct cons { - - typedef HT head_type; - typedef null_type tail_type; - typedef cons self_type; - - typedef typename - detail::wrap_non_storeable_type::type stored_head_type; - stored_head_type head; - - typename access_traits::non_const_type - get_head() { return head; } - - null_type get_tail() { return null_type(); } - - typename access_traits::const_type - get_head() const { return head; } - - const null_type get_tail() const { return null_type(); } - - // cons() : head(detail::default_arg::f()) {} - cons() : head() {} - - cons(typename access_traits::parameter_type h, - const null_type& = null_type()) - : head (h) {} - - template - cons(T1& t1, const null_type&, const null_type&, const null_type&, - const null_type&, const null_type&, const null_type&, - const null_type&, const null_type&, const null_type&) - : head (t1) {} - - cons(const null_type&, - const null_type&, const null_type&, const null_type&, - const null_type&, const null_type&, const null_type&, - const null_type&, const null_type&, const null_type&) - : head () {} - - template - cons( const cons& u ) : head(u.head) {} - - template - cons& operator=(const cons& u ) - { head = u.head; return *this; } - - // must define assignment operator explicitely, implicit version - // is illformed if HT is a reference - cons& operator=(const cons& u) { head = u.head; return *this; } - - template - typename access_traits< - typename element::type - >::non_const_type - get(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { - return boost::tuples::get(*this); - } - - template - typename access_traits< - typename element::type - >::const_type - get(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) const { - return boost::tuples::get(*this); - } - -}; - -// templates for finding out the length of the tuple ------------------- - -template -struct length { - BOOST_STATIC_CONSTANT(int, value = 1 + length::value); -}; - -template<> -struct length > { - BOOST_STATIC_CONSTANT(int, value = 0); -}; - -template<> -struct length { - BOOST_STATIC_CONSTANT(int, value = 0); -}; - - -namespace detail { - -// Tuple to cons mapper -------------------------------------------------- -template -struct map_tuple_to_cons -{ - typedef cons::type - > type; -}; - -// The empty tuple is a null_type -template <> -struct map_tuple_to_cons -{ - typedef null_type type; -}; - -} // end detail - -// ------------------------------------------------------------------- -// -- tuple ------------------------------------------------------ -template - -class tuple : - public detail::map_tuple_to_cons::type -{ -public: - typedef typename - detail::map_tuple_to_cons::type inherited; - typedef typename inherited::head_type head_type; - typedef typename inherited::tail_type tail_type; - - -// access_traits::parameter_type takes non-reference types as const T& - tuple() {} - - tuple(typename access_traits::parameter_type t0) - : inherited(t0, detail::cnull(), detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1) - : inherited(t0, t1, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2) - : inherited(t0, t1, t2, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3) - : inherited(t0, t1, t2, t3, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), - detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3, - typename access_traits::parameter_type t4) - : inherited(t0, t1, t2, t3, t4, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3, - typename access_traits::parameter_type t4, - typename access_traits::parameter_type t5) - : inherited(t0, t1, t2, t3, t4, t5, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3, - typename access_traits::parameter_type t4, - typename access_traits::parameter_type t5, - typename access_traits::parameter_type t6) - : inherited(t0, t1, t2, t3, t4, t5, t6, detail::cnull(), - detail::cnull(), detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3, - typename access_traits::parameter_type t4, - typename access_traits::parameter_type t5, - typename access_traits::parameter_type t6, - typename access_traits::parameter_type t7) - : inherited(t0, t1, t2, t3, t4, t5, t6, t7, detail::cnull(), - detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3, - typename access_traits::parameter_type t4, - typename access_traits::parameter_type t5, - typename access_traits::parameter_type t6, - typename access_traits::parameter_type t7, - typename access_traits::parameter_type t8) - : inherited(t0, t1, t2, t3, t4, t5, t6, t7, t8, detail::cnull()) {} - - tuple(typename access_traits::parameter_type t0, - typename access_traits::parameter_type t1, - typename access_traits::parameter_type t2, - typename access_traits::parameter_type t3, - typename access_traits::parameter_type t4, - typename access_traits::parameter_type t5, - typename access_traits::parameter_type t6, - typename access_traits::parameter_type t7, - typename access_traits::parameter_type t8, - typename access_traits::parameter_type t9) - : inherited(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) {} - - - template - tuple(const cons& p) : inherited(p) {} - - template - tuple& operator=(const cons& k) { - inherited::operator=(k); - return *this; - } - - template - tuple& operator=(const std::pair& k) { - BOOST_STATIC_ASSERT(length::value == 2);// check_length = 2 - this->head = k.first; - this->tail.head = k.second; - return *this; - } - -}; - -// The empty tuple -template <> -class tuple : - public null_type -{ -public: - typedef null_type inherited; -}; - - -// Swallows any assignment (by Doug Gregor) -namespace detail { - -struct swallow_assign { - - template - swallow_assign const& operator=(const T&) const { - return *this; - } -}; - -} // namespace detail - -// "ignore" allows tuple positions to be ignored when using "tie". -detail::swallow_assign const ignore = detail::swallow_assign(); - -// --------------------------------------------------------------------------- -// The call_traits for make_tuple -// Honours the reference_wrapper class. - -// Must be instantiated with plain or const plain types (not with references) - -// from template foo(const T& t) : make_tuple_traits::type -// from template foo(T& t) : make_tuple_traits::type - -// Conversions: -// T -> T, -// references -> compile_time_error -// reference_wrapper -> T& -// const reference_wrapper -> T& -// array -> const ref array - - -template -struct make_tuple_traits { - typedef T type; - - // commented away, see below (JJ) - // typedef typename IF< - // boost::is_function::value, - // T&, - // T>::RET type; - -}; - -// The is_function test was there originally for plain function types, -// which can't be stored as such (we must either store them as references or -// pointers). Such a type could be formed if make_tuple was called with a -// reference to a function. -// But this would mean that a const qualified function type was formed in -// the make_tuple function and hence make_tuple can't take a function -// reference as a parameter, and thus T can't be a function type. -// So is_function test was removed. -// (14.8.3. says that type deduction fails if a cv-qualified function type -// is created. (It only applies for the case of explicitly specifying template -// args, though?)) (JJ) - -template -struct make_tuple_traits { - typedef typename - detail::generate_error:: - do_not_use_with_reference_type error; -}; - -// Arrays can't be stored as plain types; convert them to references. -// All arrays are converted to const. This is because make_tuple takes its -// parameters as const T& and thus the knowledge of the potential -// non-constness of actual argument is lost. -template struct make_tuple_traits { - typedef const T (&type)[n]; -}; - -template -struct make_tuple_traits { - typedef const T (&type)[n]; -}; - -template struct make_tuple_traits { - typedef const volatile T (&type)[n]; -}; - -template -struct make_tuple_traits { - typedef const volatile T (&type)[n]; -}; - -template -struct make_tuple_traits >{ - typedef T& type; -}; - -template -struct make_tuple_traits >{ - typedef T& type; -}; - - - - -namespace detail { - -// a helper traits to make the make_tuple functions shorter (Vesa Karvonen's -// suggestion) -template < - class T0 = null_type, class T1 = null_type, class T2 = null_type, - class T3 = null_type, class T4 = null_type, class T5 = null_type, - class T6 = null_type, class T7 = null_type, class T8 = null_type, - class T9 = null_type -> -struct make_tuple_mapper { - typedef - tuple::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type> type; -}; - -} // end detail - -// -make_tuple function templates ----------------------------------- -inline tuple<> make_tuple() { - return tuple<>(); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0) { - typedef typename detail::make_tuple_mapper::type t; - return t(t0); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1) { - typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1, const T2& t2) { - typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1, t2); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3) { - typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1, t2, t3); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, - const T4& t4) { - typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1, t2, t3, t4); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5) { - typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1, t2, t3, t4, t5); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6) { - typedef typename detail::make_tuple_mapper - ::type t; - return t(t0, t1, t2, t3, t4, t5, t6); -} - -template -inline typename detail::make_tuple_mapper::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6, const T7& t7) { - typedef typename detail::make_tuple_mapper - ::type t; - return t(t0, t1, t2, t3, t4, t5, t6, t7); -} - -template -inline typename detail::make_tuple_mapper - ::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6, const T7& t7, - const T8& t8) { - typedef typename detail::make_tuple_mapper - ::type t; - return t(t0, t1, t2, t3, t4, t5, t6, t7, t8); -} - -template -inline typename detail::make_tuple_mapper - ::type -make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6, const T7& t7, - const T8& t8, const T9& t9) { - typedef typename detail::make_tuple_mapper - ::type t; - return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9); -} - - - -// Tie function templates ------------------------------------------------- -template -inline tuple tie(T1& t1) { - return tuple (t1); -} - -template -inline tuple tie(T1& t1, T2& t2) { - return tuple (t1, t2); -} - -template -inline tuple tie(T1& t1, T2& t2, T3& t3) { - return tuple (t1, t2, t3); -} - -template -inline tuple tie(T1& t1, T2& t2, T3& t3, T4& t4) { - return tuple (t1, t2, t3, t4); -} - -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) { - return tuple (t1, t2, t3, t4, t5); -} - -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) { - return tuple (t1, t2, t3, t4, t5, t6); -} - -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) { - return tuple (t1, t2, t3, t4, t5, t6, t7); -} - -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) { - return tuple - (t1, t2, t3, t4, t5, t6, t7, t8); -} - -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, - T9& t9) { - return tuple - (t1, t2, t3, t4, t5, t6, t7, t8, t9); -} - -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, - T9& t9, T10& t10) { - return tuple - (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); -} - -} // end of namespace tuples -} // end of namespace boost - - -#endif // BOOST_TUPLE_BASIC_HPP - - diff --git a/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp b/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp deleted file mode 100644 index c4f65c4..0000000 --- a/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp +++ /dev/null @@ -1,841 +0,0 @@ -// - tuple_basic_no_partial_spec.hpp ----------------------------------------- - -// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) -// Copyright (C) 2001 Douglas Gregor (gregod@rpi.edu) -// Copyright (C) 2001 Gary Powell (gary.powell@sierra.com) -// -// Distributed under 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 or http://lambda.cs.utu.fi - -// Revision History -// 14 02 01 Remove extra ';'. Also, fixed 10-parameter to make_tuple. (DG) -// 10 02 01 Fixed "null_type" constructors. -// Implemented comparison operators globally. -// Hide element_type_ref and element_type_const_ref. -// (DG). -// 09 02 01 Extended to tuples of length 10. Changed comparison for -// operator<() -// to the same used by std::pair<>, added cnull_type() (GP) -// 03 02 01 Initial Version from original tuple.hpp code by JJ. (DG) - -// ----------------------------------------------------------------- - -#ifndef BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP -#define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP - -#include "boost/type_traits.hpp" -#include - -#if defined BOOST_MSVC -#pragma warning(disable:4518) // storage-class or type specifier(s) unexpected here; ignored -#pragma warning(disable:4181) // qualifier applied to reference type ignored -#pragma warning(disable:4227) // qualifier applied to reference type ignored -#endif - -namespace boost { -namespace tuples { - - // null_type denotes the end of a list built with "cons" - struct null_type - { - null_type() {} - null_type(const null_type&, const null_type&) {} - }; - - // a helper function to provide a const null_type type temporary - inline const null_type cnull_type() { return null_type(); } - -// forward declaration of tuple - template< - typename T1 = null_type, - typename T2 = null_type, - typename T3 = null_type, - typename T4 = null_type, - typename T5 = null_type, - typename T6 = null_type, - typename T7 = null_type, - typename T8 = null_type, - typename T9 = null_type, - typename T10 = null_type - > - class tuple; - -// forward declaration of cons - template - struct cons; - - namespace detail { - - // Takes a pointer and routes all assignments to whatever it points to - template - struct assign_to_pointee - { - public: - explicit assign_to_pointee(T* p) : ptr(p) {} - - template - assign_to_pointee& operator=(const Other& other) - { - *ptr = other; - return *this; - } - - private: - T* ptr; - }; - - // Swallows any assignment - struct swallow_assign - { - template - swallow_assign const& operator=(const T&) const - { - return *this; - } - }; - - template struct add_const_reference : add_reference::type> {}; - - template - struct init_tail - { - // Each of vc6 and vc7 seem to require a different formulation - // of this return type - template -#if BOOST_WORKAROUND(BOOST_MSVC, == 1200) - static typename add_reference::type>::type -#else - static typename add_const_reference::type -#endif - execute( cons const& u, long ) - { - return u.get_tail(); - } - }; - - template <> - struct init_tail - { - template - static null_type execute( cons const& u, long ) - { - return null_type(); - } - - template - static null_type execute(U const&, ...) - { - return null_type(); - } - private: - template - void execute( cons const&, int); - }; - - template - Other const& - init_head( Other const& u, ... ) - { - return u; - } - - template - typename add_reference::type>::type - init_head( cons const& u, int ) - { - return u.get_head(); - } - - inline char**** init_head(null_type const&, int); - - } // end of namespace detail - - // cons builds a heterogenous list of types - template - struct cons - { - typedef cons self_type; - typedef Head head_type; - typedef Tail tail_type; - - private: - typedef typename boost::add_reference::type head_ref; - typedef typename boost::add_reference::type tail_ref; - typedef typename detail::add_const_reference::type head_cref; - typedef typename detail::add_const_reference::type tail_cref; - public: - head_type head; - tail_type tail; - - head_ref get_head() { return head; } - tail_ref get_tail() { return tail; } - - head_cref get_head() const { return head; } - tail_cref get_tail() const { return tail; } - - cons() : head(), tail() {} - -#if defined BOOST_MSVC - template - cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf. - const Tail& t) : head(h), tail(t.head, t.tail) - { - } - - cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf. - const null_type& t) : head(h), tail(t) - { - } - -#else - template - explicit cons(head_cref h, const T& t) : - head(h), tail(t.head, t.tail) - { - } - - explicit cons(head_cref h = head_type(), - tail_cref t = tail_type()) : - head(h), tail(t) - { - } -#endif - - template - cons( const U& u ) - : head(detail::init_head(u, 0)) - , tail(detail::init_tail::execute(u, 0L)) - { - } - - template - cons& operator=(const Other& other) - { - head = other.head; - tail = other.tail; - return *this; - } - }; - - namespace detail { - - // Determines if the parameter is null_type - template struct is_null_type { enum { RET = 0 }; }; - template<> struct is_null_type { enum { RET = 1 }; }; - - /* Build a cons structure from the given Head and Tail. If both are null_type, - return null_type. */ - template - struct build_cons - { - private: - enum { tail_is_null_type = is_null_type::RET }; - public: - typedef cons RET; - }; - - template<> - struct build_cons - { - typedef null_type RET; - }; - - // Map the N elements of a tuple into a cons list - template< - typename T1, - typename T2 = null_type, - typename T3 = null_type, - typename T4 = null_type, - typename T5 = null_type, - typename T6 = null_type, - typename T7 = null_type, - typename T8 = null_type, - typename T9 = null_type, - typename T10 = null_type - > - struct map_tuple_to_cons - { - typedef typename detail::build_cons::RET cons10; - typedef typename detail::build_cons::RET cons9; - typedef typename detail::build_cons::RET cons8; - typedef typename detail::build_cons::RET cons7; - typedef typename detail::build_cons::RET cons6; - typedef typename detail::build_cons::RET cons5; - typedef typename detail::build_cons::RET cons4; - typedef typename detail::build_cons::RET cons3; - typedef typename detail::build_cons::RET cons2; - typedef typename detail::build_cons::RET cons1; - }; - - // Workaround the lack of partial specialization in some compilers - template - struct _element_type - { - template - struct inner - { - private: - typedef typename Tuple::tail_type tail_type; - typedef _element_type next_elt_type; - - public: - typedef typename _element_type::template inner::RET RET; - }; - }; - - template<> - struct _element_type<0> - { - template - struct inner - { - typedef typename Tuple::head_type RET; - }; - }; - - } // namespace detail - - - // Return the Nth type of the given Tuple - template - struct element - { - private: - typedef detail::_element_type nth_type; - - public: - typedef typename nth_type::template inner::RET RET; - typedef RET type; - }; - - namespace detail { - -#if defined(BOOST_MSVC) && (BOOST_MSVC == 1300) - // special workaround for vc7: - - template - struct reference_adder - { - template - struct rebind - { - typedef T& type; - }; - }; - - template <> - struct reference_adder - { - template - struct rebind - { - typedef T type; - }; - }; - - - // Return a reference to the Nth type of the given Tuple - template - struct element_ref - { - private: - typedef typename element::RET elt_type; - enum { is_ref = is_reference::value }; - - public: - typedef reference_adder::rebind::type RET; - typedef RET type; - }; - - // Return a const reference to the Nth type of the given Tuple - template - struct element_const_ref - { - private: - typedef typename element::RET elt_type; - enum { is_ref = is_reference::value }; - - public: - typedef reference_adder::rebind::type RET; - typedef RET type; - }; - -#else // vc7 - - // Return a reference to the Nth type of the given Tuple - template - struct element_ref - { - private: - typedef typename element::RET elt_type; - - public: - typedef typename add_reference::type RET; - typedef RET type; - }; - - // Return a const reference to the Nth type of the given Tuple - template - struct element_const_ref - { - private: - typedef typename element::RET elt_type; - - public: - typedef typename add_reference::type RET; - typedef RET type; - }; -#endif // vc7 - - } // namespace detail - - // Get length of this tuple - template - struct length - { - BOOST_STATIC_CONSTANT(int, value = 1 + length::value); - }; - - template<> struct length > { - BOOST_STATIC_CONSTANT(int, value = 0); - }; - - template<> - struct length - { - BOOST_STATIC_CONSTANT(int, value = 0); - }; - - namespace detail { - - // Reference the Nth element in a tuple and retrieve it with "get" - template - struct get_class - { - template - static inline - typename detail::element_ref >::RET - get(cons& t) - { - return get_class::get(t.tail); - } - - template - static inline - typename detail::element_const_ref >::RET - get(const cons& t) - { - return get_class::get(t.tail); - } - }; - - template<> - struct get_class<0> - { - template - static inline - typename add_reference::type - get(cons& t) - { - return t.head; - } - - template - static inline - typename add_reference::type - get(const cons& t) - { - return t.head; - } - }; - - } // namespace detail - - // tuple class - template< - typename T1, - typename T2, - typename T3, - typename T4, - typename T5, - typename T6, - typename T7, - typename T8, - typename T9, - typename T10 - > - class tuple : - public detail::map_tuple_to_cons::cons1 - { - private: - typedef detail::map_tuple_to_cons mapped_tuple; - typedef typename mapped_tuple::cons10 cons10; - typedef typename mapped_tuple::cons9 cons9; - typedef typename mapped_tuple::cons8 cons8; - typedef typename mapped_tuple::cons7 cons7; - typedef typename mapped_tuple::cons6 cons6; - typedef typename mapped_tuple::cons5 cons5; - typedef typename mapped_tuple::cons4 cons4; - typedef typename mapped_tuple::cons3 cons3; - typedef typename mapped_tuple::cons2 cons2; - typedef typename mapped_tuple::cons1 cons1; - - typedef typename detail::add_const_reference::type t1_cref; - typedef typename detail::add_const_reference::type t2_cref; - typedef typename detail::add_const_reference::type t3_cref; - typedef typename detail::add_const_reference::type t4_cref; - typedef typename detail::add_const_reference::type t5_cref; - typedef typename detail::add_const_reference::type t6_cref; - typedef typename detail::add_const_reference::type t7_cref; - typedef typename detail::add_const_reference::type t8_cref; - typedef typename detail::add_const_reference::type t9_cref; - typedef typename detail::add_const_reference::type t10_cref; - public: - typedef cons1 inherited; - typedef tuple self_type; - - tuple() : cons1(T1(), cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10())))))))))) - {} - - tuple( - t1_cref t1, - t2_cref t2, - t3_cref t3 = T3(), - t4_cref t4 = T4(), - t5_cref t5 = T5(), - t6_cref t6 = T6(), - t7_cref t7 = T7(), - t8_cref t8 = T8(), - t9_cref t9 = T9(), - t10_cref t10 = T10() - ) : - cons1(t1, cons2(t2, cons3(t3, cons4(t4, cons5(t5, cons6(t6,cons7(t7,cons8(t8,cons9(t9,cons10(t10)))))))))) - { - } - - explicit tuple(t1_cref t1) - : cons1(t1, cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10())))))))))) - {} - - template - tuple(const cons& other) : - cons1(other.head, other.tail) - { - } - - template - self_type& operator=(const std::pair& other) - { - this->head = other.first; - this->tail.head = other.second; - return *this; - } - - template - self_type& operator=(const cons& other) - { - this->head = other.head; - this->tail = other.tail; - - return *this; - } - }; - - namespace detail { - - template struct workaround_holder {}; - - } // namespace detail - - template - typename detail::element_ref >::RET - get(cons& t, detail::workaround_holder* = 0) - { - return detail::get_class::get(t); - } - - template - typename detail::element_const_ref >::RET - get(const cons& t, detail::workaround_holder* = 0) - { - return detail::get_class::get(t); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1) - { - return tuple(t1); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2) - { - return tuple(t1, t2); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3) - { - return tuple(t1, t2, t3); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4) - { - return tuple(t1, t2, t3, t4); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5) - { - return tuple(t1, t2, t3, t4, t5); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6) - { - return tuple(t1, t2, t3, t4, t5, t6); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7) - { - return tuple(t1, t2, t3, t4, t5, t6, t7); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8) - { - return tuple(t1, t2, t3, t4, t5, t6, t7, t8); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9) - { - return tuple(t1, t2, t3, t4, t5, t6, t7, t8, t9); - } - - // Make a tuple - template - inline - tuple - make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10) - { - return tuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); - } - - // Tie variables into a tuple - template - inline - tuple > - tie(T1& t1) - { - return make_tuple(detail::assign_to_pointee(&t1)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee > - tie(T1& t1, T2& t2) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4), - detail::assign_to_pointee(&t5)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4), - detail::assign_to_pointee(&t5), - detail::assign_to_pointee(&t6)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4), - detail::assign_to_pointee(&t5), - detail::assign_to_pointee(&t6), - detail::assign_to_pointee(&t7)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4), - detail::assign_to_pointee(&t5), - detail::assign_to_pointee(&t6), - detail::assign_to_pointee(&t7), - detail::assign_to_pointee(&t8)); - } - - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4), - detail::assign_to_pointee(&t5), - detail::assign_to_pointee(&t6), - detail::assign_to_pointee(&t7), - detail::assign_to_pointee(&t8), - detail::assign_to_pointee(&t9)); - } - // Tie variables into a tuple - template - inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee > - tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9, T10 &t10) - { - return make_tuple(detail::assign_to_pointee(&t1), - detail::assign_to_pointee(&t2), - detail::assign_to_pointee(&t3), - detail::assign_to_pointee(&t4), - detail::assign_to_pointee(&t5), - detail::assign_to_pointee(&t6), - detail::assign_to_pointee(&t7), - detail::assign_to_pointee(&t8), - detail::assign_to_pointee(&t9), - detail::assign_to_pointee(&t10)); - } - // "ignore" allows tuple positions to be ignored when using "tie". - -detail::swallow_assign const ignore = detail::swallow_assign(); - -} // namespace tuples -} // namespace boost -#endif // BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP diff --git a/include/boost/tuple/tuple.hpp b/include/boost/tuple/tuple.hpp deleted file mode 100644 index ee7fbc4..0000000 --- a/include/boost/tuple/tuple.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// tuple.hpp - Boost Tuple Library -------------------------------------- - -// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) -// -// Distributed under 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 - -// ----------------------------------------------------------------- - -#ifndef BOOST_TUPLE_HPP -#define BOOST_TUPLE_HPP - -#if defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730 -// Work around a compiler bug. -// boost::python::tuple has to be seen by the compiler before the -// boost::tuple class template. -namespace boost { namespace python { class tuple; }} -#endif - -#include "boost/config.hpp" -#include "boost/static_assert.hpp" - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -// The MSVC version -#include "boost/tuple/detail/tuple_basic_no_partial_spec.hpp" - -#else -// other compilers -#include "boost/ref.hpp" -#include "boost/tuple/detail/tuple_basic.hpp" - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -namespace boost { - -using tuples::tuple; -using tuples::make_tuple; -using tuples::tie; -#if !defined(BOOST_NO_USING_TEMPLATE) -using tuples::get; -#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -// -// The "using tuples::get" statement causes the -// Borland compiler to ICE, use forwarding -// functions instead: -// -template -inline typename tuples::access_traits< - typename tuples::element >::type - >::non_const_type -get(tuples::cons& c) { - return tuples::get(c); -} -// get function for const cons-lists, returns a const reference to -// the element. If the element is a reference, returns the reference -// as such (that is, can return a non-const reference) -template -inline typename tuples::access_traits< - typename tuples::element >::type - >::const_type -get(const tuples::cons& c) { - return tuples::get(c); -} -#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -// -// MSVC, using declarations don't mix with templates well, -// so use forwarding functions instead: -// -template -typename tuples::detail::element_ref >::RET -get(tuples::cons& t, tuples::detail::workaround_holder* = 0) -{ - return tuples::detail::get_class::get(t); -} - -template -typename tuples::detail::element_const_ref >::RET -get(const tuples::cons& t, tuples::detail::workaround_holder* = 0) -{ - return tuples::detail::get_class::get(t); -} -#endif // BOOST_NO_USING_TEMPLATE - -} // end namespace boost - - -#endif // BOOST_TUPLE_HPP diff --git a/include/boost/tuple/tuple_comparison.hpp b/include/boost/tuple/tuple_comparison.hpp deleted file mode 100644 index 00ddd14..0000000 --- a/include/boost/tuple/tuple_comparison.hpp +++ /dev/null @@ -1,175 +0,0 @@ -// tuple_comparison.hpp ----------------------------------------------------- -// -// Copyright (C) 2001 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) -// Copyright (C) 2001 Gary Powell (gary.powell@sierra.com) -// -// Distributed under 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 -// -// (The idea and first impl. of comparison operators was from Doug Gregor) - -// ----------------------------------------------------------------- - -#ifndef BOOST_TUPLE_COMPARISON_HPP -#define BOOST_TUPLE_COMPARISON_HPP - -#include "boost/tuple/tuple.hpp" - -// ------------------------------------------------------------- -// equality and comparison operators -// -// == and != compare tuples elementwise -// <, >, <= and >= use lexicographical ordering -// -// Any operator between tuples of different length fails at compile time -// No dependencies between operators are assumed -// (i.e. !(a=b, a!=b does not imply a==b etc. -// so any weirdnesses of elementary operators are respected). -// -// ------------------------------------------------------------- - - -namespace boost { -namespace tuples { - -inline bool operator==(const null_type&, const null_type&) { return true; } -inline bool operator>=(const null_type&, const null_type&) { return true; } -inline bool operator<=(const null_type&, const null_type&) { return true; } -inline bool operator!=(const null_type&, const null_type&) { return false; } -inline bool operator<(const null_type&, const null_type&) { return false; } -inline bool operator>(const null_type&, const null_type&) { return false; } - - -namespace detail { - // comparison operators check statically the length of its operands and - // delegate the comparing task to the following functions. Hence - // the static check is only made once (should help the compiler). - // These functions assume tuples to be of the same length. - - -template -inline bool eq(const T1& lhs, const T2& rhs) { - return lhs.get_head() == rhs.get_head() && - eq(lhs.get_tail(), rhs.get_tail()); -} -template<> -inline bool eq(const null_type&, const null_type&) { return true; } - -template -inline bool neq(const T1& lhs, const T2& rhs) { - return lhs.get_head() != rhs.get_head() || - neq(lhs.get_tail(), rhs.get_tail()); -} -template<> -inline bool neq(const null_type&, const null_type&) { return false; } - -template -inline bool lt(const T1& lhs, const T2& rhs) { - return lhs.get_head() < rhs.get_head() || - !(rhs.get_head() < lhs.get_head()) && - lt(lhs.get_tail(), rhs.get_tail()); -} -template<> -inline bool lt(const null_type&, const null_type&) { return false; } - -template -inline bool gt(const T1& lhs, const T2& rhs) { - return lhs.get_head() > rhs.get_head() || - !(rhs.get_head() > lhs.get_head()) && - gt(lhs.get_tail(), rhs.get_tail()); -} -template<> -inline bool gt(const null_type&, const null_type&) { return false; } - -template -inline bool lte(const T1& lhs, const T2& rhs) { - return lhs.get_head() <= rhs.get_head() && - ( !(rhs.get_head() <= lhs.get_head()) || - lte(lhs.get_tail(), rhs.get_tail())); -} -template<> -inline bool lte(const null_type&, const null_type&) { return true; } - -template -inline bool gte(const T1& lhs, const T2& rhs) { - return lhs.get_head() >= rhs.get_head() && - ( !(rhs.get_head() >= lhs.get_head()) || - gte(lhs.get_tail(), rhs.get_tail())); -} -template<> -inline bool gte(const null_type&, const null_type&) { return true; } - -} // end of namespace detail - - -// equal ---- - -template -inline bool operator==(const cons& lhs, const cons& rhs) -{ - // check that tuple lengths are equal - BOOST_STATIC_ASSERT(length::value == length::value); - - return detail::eq(lhs, rhs); -} - -// not equal ----- - -template -inline bool operator!=(const cons& lhs, const cons& rhs) -{ - - // check that tuple lengths are equal - BOOST_STATIC_ASSERT(length::value == length::value); - - return detail::neq(lhs, rhs); -} - -// < -template -inline bool operator<(const cons& lhs, const cons& rhs) -{ - // check that tuple lengths are equal - BOOST_STATIC_ASSERT(length::value == length::value); - - return detail::lt(lhs, rhs); -} - -// > -template -inline bool operator>(const cons& lhs, const cons& rhs) -{ - // check that tuple lengths are equal - BOOST_STATIC_ASSERT(length::value == length::value); - - return detail::gt(lhs, rhs); -} - -// <= -template -inline bool operator<=(const cons& lhs, const cons& rhs) -{ - // check that tuple lengths are equal - BOOST_STATIC_ASSERT(length::value == length::value); - - return detail::lte(lhs, rhs); -} - -// >= -template -inline bool operator>=(const cons& lhs, const cons& rhs) -{ - // check that tuple lengths are equal - BOOST_STATIC_ASSERT(length::value == length::value); - - return detail::gte(lhs, rhs); -} - -} // end of namespace tuples -} // end of namespace boost - - -#endif // BOOST_TUPLE_COMPARISON_HPP diff --git a/include/boost/tuple/tuple_io.hpp b/include/boost/tuple/tuple_io.hpp deleted file mode 100644 index 467ab0a..0000000 --- a/include/boost/tuple/tuple_io.hpp +++ /dev/null @@ -1,525 +0,0 @@ -// tuple_io.hpp -------------------------------------------------------------- - -// Copyright (C) 2001 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) -// 2001 Gary Powell (gary.powell@sierra.com) -// -// Distributed under 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 - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_TUPLE_IO_HPP -#define BOOST_TUPLE_IO_HPP - - -// add to boost/config.hpp -// for now -# if defined __GNUC__ -# if (__GNUC__ == 2 && __GNUC_MINOR__ <= 97) -#define BOOST_NO_TEMPLATED_STREAMS -#endif -#endif // __GNUC__ - -#if defined BOOST_NO_TEMPLATED_STREAMS -#include -#else -#include -#include -#endif - -#include "boost/tuple/tuple.hpp" - -// This is ugly: one should be using twoargument isspace since whitspace can -// be locale dependent, in theory at least. -// not all libraries implement have the two-arg version, so we need to -// use the one-arg one, which one should get with but there seem -// to be exceptions to this. - -#if !defined (BOOST_NO_STD_LOCALE) - -#include // for two-arg isspace - -#else - -#include // for one-arg (old) isspace -#include // Metrowerks does not find one-arg isspace from cctype - -#endif - -namespace boost { -namespace tuples { - -namespace detail { - -class format_info { -public: - - enum manipulator_type { open, close, delimiter }; - BOOST_STATIC_CONSTANT(int, number_of_manipulators = delimiter + 1); -private: - - static int get_stream_index (int m) - { - static const int stream_index[number_of_manipulators] - = { std::ios::xalloc(), std::ios::xalloc(), std::ios::xalloc() }; - - return stream_index[m]; - } - - format_info(const format_info&); - format_info(); - - -public: - -#if defined (BOOST_NO_TEMPLATED_STREAMS) - static char get_manipulator(std::ios& i, manipulator_type m) { - char c = static_cast(i.iword(get_stream_index(m))); - - // parentheses and space are the default manipulators - if (!c) { - switch(m) { - case detail::format_info::open : c = '('; break; - case detail::format_info::close : c = ')'; break; - case detail::format_info::delimiter : c = ' '; break; - } - } - return c; - } - - static void set_manipulator(std::ios& i, manipulator_type m, char c) { - i.iword(get_stream_index(m)) = static_cast(c); - } -#else - template - static CharType get_manipulator(std::basic_ios& i, - manipulator_type m) { - // The manipulators are stored as long. - // A valid instanitation of basic_stream allows CharType to be any POD, - // hence, the static_cast may fail (it fails if long is not convertible - // to CharType - CharType c = static_cast(i.iword(get_stream_index(m)) ); - // parentheses and space are the default manipulators - if (!c) { - switch(m) { - case detail::format_info::open : c = i.widen('('); break; - case detail::format_info::close : c = i.widen(')'); break; - case detail::format_info::delimiter : c = i.widen(' '); break; - } - } - return c; - } - - - template - static void set_manipulator(std::basic_ios& i, - manipulator_type m, CharType c) { - // The manipulators are stored as long. - // A valid instanitation of basic_stream allows CharType to be any POD, - // hence, the static_cast may fail (it fails if CharType is not - // convertible long. - i.iword(get_stream_index(m)) = static_cast(c); - } -#endif // BOOST_NO_TEMPLATED_STREAMS -}; - -} // end of namespace detail - -template -class tuple_manipulator { - const detail::format_info::manipulator_type mt; - CharType f_c; -public: - explicit tuple_manipulator(detail::format_info::manipulator_type m, - const char c = 0) - : mt(m), f_c(c) {} - -#if defined (BOOST_NO_TEMPLATED_STREAMS) - void set(std::ios &io) const { - detail::format_info::set_manipulator(io, mt, f_c); - } -#else -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - template - void set(std::basic_ios &io) const { - detail::format_info::set_manipulator(io, mt, f_c); - } -#else - template - void set(std::basic_ios &io) const { - detail::format_info::set_manipulator(io, mt, f_c); - } -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -#endif // BOOST_NO_TEMPLATED_STREAMS -}; - -#if defined (BOOST_NO_TEMPLATED_STREAMS) -inline std::ostream& -operator<<(std::ostream& o, const tuple_manipulator& m) { - m.set(o); - return o; -} - -inline std::istream& -operator>>(std::istream& i, const tuple_manipulator& m) { - m.set(i); - return i; -} - -#else - -template -inline std::basic_ostream& -operator<<(std::basic_ostream& o, const tuple_manipulator& m) { - m.set(o); - return o; -} - -template -inline std::basic_istream& -operator>>(std::basic_istream& i, const tuple_manipulator& m) { - m.set(i); - return i; -} - -#endif // BOOST_NO_TEMPLATED_STREAMS - -template -inline tuple_manipulator set_open(const CharType c) { - return tuple_manipulator(detail::format_info::open, c); -} - -template -inline tuple_manipulator set_close(const CharType c) { - return tuple_manipulator(detail::format_info::close, c); -} - -template -inline tuple_manipulator set_delimiter(const CharType c) { - return tuple_manipulator(detail::format_info::delimiter, c); -} - - - - - -// ------------------------------------------------------------- -// printing tuples to ostream in format (a b c) -// parentheses and space are defaults, but can be overriden with manipulators -// set_open, set_close and set_delimiter - -namespace detail { - -// Note: The order of the print functions is critical -// to let a conforming compiler find and select the correct one. - -#if defined (BOOST_NO_TEMPLATED_STREAMS) - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -template -inline std::ostream& print(std::ostream& o, const cons& t) { - return o << t.head; -} -#endif // BOOST_NO_TEMPLATED_STREAMS - -inline std::ostream& print(std::ostream& o, const null_type&) { return o; } - -template -inline std::ostream& -print(std::ostream& o, const cons& t) { - - const char d = format_info::get_manipulator(o, format_info::delimiter); - - o << t.head; - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - if (tuples::length::value == 0) - return o; -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - o << d; - - return print(o, t.tail ); - -} - - - -#else - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -template -inline std::basic_ostream& -print(std::basic_ostream& o, const cons& t) { - return o << t.head; -} -#endif // !BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - - -template -inline std::basic_ostream& -print(std::basic_ostream& o, const null_type&) { - return o; -} - -template -inline std::basic_ostream& -print(std::basic_ostream& o, const cons& t) { - - const CharType d = format_info::get_manipulator(o, format_info::delimiter); - - o << t.head; - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - if (tuples::length::value == 0) - return o; -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - o << d; - - return print(o, t.tail); -} - -#endif // BOOST_NO_TEMPLATED_STREAMS - -} // namespace detail - -#if defined (BOOST_NO_TEMPLATED_STREAMS) -template -inline std::ostream& operator<<(std::ostream& o, const cons& t) { - if (!o.good() ) return o; - - const char l = - detail::format_info::get_manipulator(o, detail::format_info::open); - const char r = - detail::format_info::get_manipulator(o, detail::format_info::close); - - o << l; - - detail::print(o, t); - - o << r; - - return o; -} - -#else - -template -inline std::basic_ostream& -operator<<(std::basic_ostream& o, - const cons& t) { - if (!o.good() ) return o; - - const CharType l = - detail::format_info::get_manipulator(o, detail::format_info::open); - const CharType r = - detail::format_info::get_manipulator(o, detail::format_info::close); - - o << l; - - detail::print(o, t); - - o << r; - - return o; -} -#endif // BOOST_NO_TEMPLATED_STREAMS - - -// ------------------------------------------------------------- -// input stream operators - -namespace detail { - -#if defined (BOOST_NO_TEMPLATED_STREAMS) - -inline std::istream& -extract_and_check_delimiter( - std::istream& is, format_info::manipulator_type del) -{ - const char d = format_info::get_manipulator(is, del); - -#if defined (BOOST_NO_STD_LOCALE) - const bool is_delimiter = !isspace(d); -#else - const bool is_delimiter = (!std::isspace(d, is.getloc()) ); -#endif - - char c; - if (is_delimiter) { - is >> c; - if (c!=d) { - is.setstate(std::ios::failbit); - } - } - return is; -} - - -// Note: The order of the read functions is critical to let a -// (conforming?) compiler find and select the correct one. - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -template -inline std::istream & -read (std::istream &is, cons& t1) { - - if (!is.good()) return is; - - return is >> t1.head ; -} -#else -inline std::istream& read(std::istream& i, const null_type&) { return i; } -#endif // !BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -template -inline std::istream& -read(std::istream &is, cons& t1) { - - if (!is.good()) return is; - - is >> t1.head; - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - if (tuples::length::value == 0) - return is; -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - - extract_and_check_delimiter(is, format_info::delimiter); - - return read(is, t1.tail); -} - -} // end namespace detail - -inline std::istream& -operator>>(std::istream &is, null_type&) { - - if (!is.good() ) return is; - - detail::extract_and_check_delimiter(is, detail::format_info::open); - detail::extract_and_check_delimiter(is, detail::format_info::close); - - return is; -} - - -template -inline std::istream& -operator>>(std::istream& is, cons& t1) { - - if (!is.good() ) return is; - - detail::extract_and_check_delimiter(is, detail::format_info::open); - - detail::read(is, t1); - - detail::extract_and_check_delimiter(is, detail::format_info::close); - - return is; -} - - - -#else - -template -inline std::basic_istream& -extract_and_check_delimiter( - std::basic_istream &is, format_info::manipulator_type del) -{ - const CharType d = format_info::get_manipulator(is, del); - -#if defined (BOOST_NO_STD_LOCALE) - const bool is_delimiter = !isspace(d); -#elif defined ( __BORLANDC__ ) - const bool is_delimiter = !std::use_facet< std::ctype< CharType > > - (is.getloc() ).is( std::ctype_base::space, d); -#else - const bool is_delimiter = (!std::isspace(d, is.getloc()) ); -#endif - - CharType c; - if (is_delimiter) { - is >> c; - if (c!=d) { - is.setstate(std::ios::failbit); - } - } - return is; -} - - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -template -inline std::basic_istream & -read (std::basic_istream &is, cons& t1) { - - if (!is.good()) return is; - - return is >> t1.head; -} -#else -template -inline std::basic_istream& -read(std::basic_istream& i, const null_type&) { return i; } - -#endif // !BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -template -inline std::basic_istream& -read(std::basic_istream &is, cons& t1) { - - if (!is.good()) return is; - - is >> t1.head; - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - if (tuples::length::value == 0) - return is; -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - - extract_and_check_delimiter(is, format_info::delimiter); - - return read(is, t1.tail); -} - -} // end namespace detail - - -template -inline std::basic_istream& -operator>>(std::basic_istream &is, null_type&) { - - if (!is.good() ) return is; - - detail::extract_and_check_delimiter(is, detail::format_info::open); - detail::extract_and_check_delimiter(is, detail::format_info::close); - - return is; -} - -template -inline std::basic_istream& -operator>>(std::basic_istream& is, cons& t1) { - - if (!is.good() ) return is; - - detail::extract_and_check_delimiter(is, detail::format_info::open); - - detail::read(is, t1); - - detail::extract_and_check_delimiter(is, detail::format_info::close); - - return is; -} - -#endif // BOOST_NO_TEMPLATED_STREAMS - -} // end of namespace tuples -} // end of namespace boost - -#endif // BOOST_TUPLE_IO_HPP - -