File indexing completed on 2025-11-03 09:26:51
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 #ifndef BOOST_IOSTREAMS_DETAIL_DOUBLE_OBJECT_HPP_INCLUDED
0015 #define BOOST_IOSTREAMS_DETAIL_DOUBLE_OBJECT_HPP_INCLUDED
0016 
0017 #if defined(_MSC_VER)
0018 # pragma once
0019 #endif              
0020 
0021 #include <algorithm>              // swap.
0022 #include <boost/detail/workaround.hpp>
0023 #include <boost/mpl/if.hpp>
0024 #if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
0025 # include <msl_utility>
0026 #else
0027 # include <boost/call_traits.hpp>
0028 #endif
0029 
0030 namespace boost { namespace iostreams { namespace detail {
0031 
0032 template<typename T>
0033 class single_object_holder {
0034 public:
0035 #if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
0036     typedef Metrowerks::call_traits<T>             traits_type;
0037 #else
0038     typedef boost::call_traits<T>                  traits_type;
0039 #endif
0040     typedef typename traits_type::param_type       param_type;
0041     typedef typename traits_type::reference        reference;
0042     typedef typename traits_type::const_reference  const_reference;
0043     single_object_holder() { }
0044     single_object_holder(param_type t) : first_(t) { }
0045     reference first() { return first_; }
0046     const_reference first() const { return first_; }
0047     reference second() { return first_; }
0048     const_reference second() const { return first_; }
0049     void swap(single_object_holder& o)
0050     { std::swap(first_, o.first_); }
0051 private:
0052     T first_;
0053 };
0054 
0055 template<typename T>
0056 struct double_object_holder {
0057 public:
0058 #if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
0059     typedef Metrowerks::call_traits<T>             traits_type;
0060 #else
0061     typedef boost::call_traits<T>                  traits_type;
0062 #endif
0063     typedef typename traits_type::param_type       param_type;
0064     typedef typename traits_type::reference        reference;
0065     typedef typename traits_type::const_reference  const_reference;
0066     double_object_holder() { }
0067     double_object_holder(param_type t1, param_type t2)
0068         : first_(t1), second_(t2) { }
0069     reference first() { return first_; }
0070     const_reference first() const { return first_; }
0071     reference second() { return second_; }
0072     const_reference second() const { return second_; }
0073     void swap(double_object_holder& d)
0074     { 
0075         std::swap(first_, d.first_); 
0076         std::swap(second_, d.second_); 
0077     }
0078 private:
0079     T first_, second_;
0080 };
0081 
0082 template<typename T, typename IsDouble>
0083 class double_object 
0084     : public mpl::if_<
0085                  IsDouble, 
0086                  double_object_holder<T>, 
0087                  single_object_holder<T>
0088              >::type
0089 {
0090 private:
0091     typedef typename 
0092             mpl::if_<
0093                 IsDouble, 
0094                 double_object_holder<T>, 
0095                 single_object_holder<T>
0096             >::type                                base_type;
0097 public:
0098 #if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
0099     typedef Metrowerks::call_traits<T>             traits_type;
0100 #else
0101     typedef boost::call_traits<T>                  traits_type;
0102 #endif
0103     typedef typename traits_type::param_type       param_type;
0104     typedef typename traits_type::reference        reference;
0105     typedef typename traits_type::const_reference  const_reference;
0106     double_object() : base_type() {}
0107     double_object(param_type t1, param_type t2)
0108         : base_type(t1, t2) { }
0109     bool is_double() const { return IsDouble::value; }
0110 };
0111 
0112 } } } 
0113 
0114 #endif