// (C) Copyright Jonathan Turkanis 2004. // 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. // Disclaimer: Not a Boost library. #ifndef BOOST_IOSTREAMS_DETAIL_TUPLE_HPP_INCLUDED #define BOOST_IOSTREAMS_DETAIL_TUPLE_HPP_INCLUDED #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include #include // tuple max arity. #include #include #include #include #include #include #include #include #include namespace boost { namespace io { //namespace detail { // //template //struct is_tuple_like_impl : mpl::false_ { }; // //template //struct tuple_size_impl : mpl::int_<1> { }; // //} // End namespace detail. template struct is_tuple_like : mpl::false_ { }; template struct tuple_size : mpl::int_<1> { }; template struct tuple_element { typedef T type; }; //template //typename //disable_if< // is_tuple_like, // typename add_reference::type //>::type //tuple_get(T& t) //{ // BOOST_STATIC_ASSERT(N == 0); // return t; //} template typename disable_if< is_tuple_like, typename add_reference< const typename remove_reference::type >::type >::type tuple_get(const T& t) { BOOST_STATIC_ASSERT(N == 0); return t; } ////------------------Definition of tuple operations for arrays-----------------// // //template //struct is_tuple_like< T[N] > : mpl::true_ { }; // //template //struct tuple_size< T[N] > : mpl::int_ { }; // //template //T& tuple_get(T (&ar)[M]) //{ // BOOST_STATIC_ASSERT(N < M); // return ar[N]; //} // //template //struct tuple_element< N, T[M] > { // BOOST_STATIC_ASSERT(N < M); // typedef T type; //}; //------------------Definition of tuple operations for std::pair--------------// namespace detail { template struct get_pair_element; template<> struct get_pair_element<0> { template static typename add_reference::type execute(std::pair& p) { return p.first; } template static typename add_reference::type execute(const std::pair& p) { return p.first; } }; template<> struct get_pair_element<1> { template static typename add_reference::type execute(std::pair& p) { return p.second; } template static typename add_reference::type execute(const std::pair& p) { return p.second; } }; } // end namespace detail. template struct is_tuple_like< std::pair > : mpl::true_ { }; template struct tuple_size< std::pair > : mpl::int_<2> { }; template typename mpl::if_< mpl::bool_, typename add_reference::type, typename add_reference::type >::type tuple_get(std::pair& p) { return detail::get_pair_element::execute(p); } template typename mpl::if_< mpl::bool_, typename add_reference::type, typename add_reference::type >::type tuple_get(const std::pair& p) { BOOST_STATIC_ASSERT(N == 0 || N == 1); return detail::get_pair_element::execute(p); } template struct tuple_element< N, std::pair > : mpl::if_c { BOOST_STATIC_ASSERT(N == 0 || N == 1); }; ////------------------Definition of tuple operations for std::complex-----------// // //namespace detail { // //template //class complex_real { //public: // complex_real(std::complex& c) : c(c) { } // operator T() const { return c.real(); } // void operator=(T t) { c = std::complex(t, c.imag()); } //private: // std::complex& c; //}; // //template //class complex_imag { //public: // complex_imag(std::complex& c) : c(c) { } // operator T() const { return c.imag(); } // void operator=(T t) { c = std::complex(c.real(), t); } //private: // std::complex& c; //}; // //template //struct get_complex_element; // //template<> //struct get_complex_element<0> { // template // static complex_real // execute(std::complex& c) { return complex_real(c); } // // template // static T execute(const std::complex& c) { return c.real(); } //}; // //template<> //struct get_complex_element<1> { // template // static complex_imag // execute(std::complex& c) { return complex_imag(c); } // // template // static T execute(const std::complex& c) { return c.imag(); } //}; // //} // end namespace detail. // //template //struct is_tuple_like_impl< std::complex > : mpl::true_ { }; // //template //struct tuple_size_impl< std::complex > : mpl::int_<2> { }; // //template //typename //mpl::if_c< // N, detail::complex_imag, detail::complex_real //>::type //tuple_get(std::complex& c) //{ // BOOST_STATIC_ASSERT(N == 0 || N == 1); // return detail::get_complex_element::execute(c); //} // //template //T tuple_get(const std::complex& c) //{ // BOOST_STATIC_ASSERT(N == 0 || N == 1); // return detail::get_complex_element::execute(c); //} // //template //struct tuple_element< N, std::complex > { // BOOST_STATIC_ASSERT(N == 0 || N == 1); // typedef T type; //}; //------------------Definition of tuple operations for tuples-----------------// template struct is_tuple_like< tuple > : mpl::true_ { }; template struct tuple_size< tuple > : mpl::int_< tuples::length< tuple >::value > { }; template struct tuple_element< N, tuple > { typedef tuple tuple_type; typedef typename boost::tuples::element::type type; }; template typename add_reference< typename tuples::element< N, tuple >::type >::type tuple_get(tuple& t) { return boost::tuples::get(t); } template typename add_reference< typename tuples::element< N, const tuple >::type >::type tuple_get(const tuple& t) { return boost::tuples::get(t); } //------------------Definition of tuple operations for boost::array---------// template struct is_tuple_like< boost::array > : mpl::true_ { }; template struct tuple_size< boost::array > : mpl::int_ { }; template T& tuple_get(boost::array& ar) { BOOST_STATIC_ASSERT(N < M); return ar[N]; } template const T& tuple_get(const boost::array& ar) { BOOST_STATIC_ASSERT(N < M); return ar[N]; } template struct tuple_element< N, boost::array > { BOOST_STATIC_ASSERT(N < M); typedef T type; }; ////------------------Definition of tuple operations for boost::rational--------// // //namespace detail { // //template //class rational_numerator { //public: // rational_numerator(boost::rational& r) : r(r) { } // operator T() const { return r.numerator(); } // void operator=(T t) { r = boost::rational(t, r.denominator()); } //private: // boost::rational& r; //}; // //template //class rational_denominator { //public: // rational_denominator(boost::rational& r) : r(r) { } // operator T() const { return r.denominator(); } // void operator=(T t) { r = boost::rational(r.numerator(), t); } //private: // boost::rational& r; //}; // //template //struct get_rational_element; // //template<> //struct get_rational_element<0> { // template // static rational_numerator // execute(boost::rational& r) { return rational_numerator(r); } // // template // static T execute(const boost::rational& r) { return r.numerator(); } //}; // //template<> //struct get_rational_element<1> { // template // static rational_denominator // execute(boost::rational& r) { return rational_denominator(r); } // // template // static T execute(const boost::rational& r) { return r.denominator(); } //}; // //} // end namespace detail. // //template //struct is_tuple_like< boost::rational > : mpl::true_ { }; // //template //struct tuple_size< boost::rational > : mpl::int_<2> { }; // //template //typename //mpl::if_c< // N, detail::rational_denominator, detail::rational_numerator //>::type //tuple_get(boost::rational& r) //{ // BOOST_STATIC_ASSERT(N == 0 || N == 1); // return detail::get_rational_element::execute(r); //} // //template //T tuple_get(const boost::rational& r) //{ // BOOST_STATIC_ASSERT(N == 0 || N == 1); // return detail::get_rational_element::execute(r); //} // //template //struct tuple_element< N, boost::rational > { // BOOST_STATIC_ASSERT(N == 0 || N == 1); // typedef T type; //}; } } // End namespaces io, boost. #endif // #ifndef BOOST_IOSTREAMS_DETAIL_TUPLE_HPP_INCLUDED