Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/spirit/home/classic/phoenix/special_ops.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/spirit/home/classic/phoenix/special_ops.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,341 @@ +/*============================================================================= + Phoenix V1.2.1 + Copyright (c) 2001-2002 Joel de Guzman + + 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) +==============================================================================*/ +#ifndef PHOENIX_SPECIAL_OPS_HPP +#define PHOENIX_SPECIAL_OPS_HPP + +#include <boost/config.hpp> +#ifdef BOOST_NO_STRINGSTREAM +#include <strstream> +#define PHOENIX_SSTREAM strstream +#else +#include <sstream> +#define PHOENIX_SSTREAM stringstream +#endif + +/////////////////////////////////////////////////////////////////////////////// +#include <boost/spirit/home/classic/phoenix/operators.hpp> +#include <iosfwd> + +/////////////////////////////////////////////////////////////////////////////// +#if defined(_STLPORT_VERSION) && defined(__STL_USE_OWN_NAMESPACE) +#define PHOENIX_STD _STLP_STD +#define PHOENIX_NO_STD_NAMESPACE +#else +#define PHOENIX_STD std +#endif + +/////////////////////////////////////////////////////////////////////////////// +//#if !defined(PHOENIX_NO_STD_NAMESPACE) +namespace PHOENIX_STD +{ +//#endif + + template<typename T> class complex; + +//#if !defined(PHOENIX_NO_STD_NAMESPACE) +} +//#endif + +/////////////////////////////////////////////////////////////////////////////// +namespace phoenix +{ + +/////////////////////////////////////////////////////////////////////////////// +// +// The following specializations take into account the C++ standard +// library components. There are a couple of issues that have to be +// dealt with to enable lazy operator overloads for the standard +// library classes. +// +// *iostream (e.g. cout, cin, strstream/ stringstream) uses non- +// canonical shift operator overloads where the lhs is taken in +// by reference. +// +// *I/O manipulators overloads for the RHS of the << and >> +// operators. +// +// *STL iterators can be objects that conform to pointer semantics. +// Some operators need to be specialized for these. +// +// *std::complex is given a rank (see rank class in operators.hpp) +// +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// +// specialization for rank<std::complex> +// +/////////////////////////////////////////////////////////////////////////////// +template <typename T> struct rank<PHOENIX_STD::complex<T> > +{ static int const value = 170 + rank<T>::value; }; + +/////////////////////////////////////////////////////////////////////////////// +// +// specializations for std::istream +// +/////////////////////////////////////////////////////////////////////////////// +#if defined(__GNUC__) && (__GNUC__ < 3) + #if defined(_STLPORT_VERSION) + #define PHOENIX_ISTREAM _IO_istream_withassign + #else + #define PHOENIX_ISTREAM PHOENIX_STD::_IO_istream_withassign + #endif +#else +// #if (defined(__ICL) && defined(_STLPORT_VERSION)) +// #define PHOENIX_ISTREAM istream_withassign +// #else + #define PHOENIX_ISTREAM PHOENIX_STD::istream +// #endif +#endif + +////////////////////////////////// +#if defined(__GNUC__) && (__GNUC__ < 3) +// || (defined(__ICL) && defined(_STLPORT_VERSION)) +template <typename T1> +struct binary_operator<shift_r_op, PHOENIX_ISTREAM, T1> +{ + typedef PHOENIX_STD::istream& result_type; + static result_type eval(PHOENIX_STD::istream& out, T1& rhs) + { return out >> rhs; } +}; +#endif + +////////////////////////////////// +template <typename T1> +struct binary_operator<shift_r_op, PHOENIX_STD::istream, T1> +{ + typedef PHOENIX_STD::istream& result_type; + static result_type eval(PHOENIX_STD::istream& out, T1& rhs) + { return out >> rhs; } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary3 + <shift_r_op, variable<PHOENIX_ISTREAM>, BaseT>::type +operator>>(PHOENIX_ISTREAM& _0, actor<BaseT> const& _1) +{ + return impl::make_binary3 + <shift_r_op, variable<PHOENIX_ISTREAM>, BaseT> + ::construct(var(_0), _1); +} + +#undef PHOENIX_ISTREAM +/////////////////////////////////////////////////////////////////////////////// +// +// specializations for std::ostream +// +/////////////////////////////////////////////////////////////////////////////// +#if defined(__GNUC__) && (__GNUC__ < 3) + #if defined(_STLPORT_VERSION) + #define PHOENIX_OSTREAM _IO_ostream_withassign + #else + #define PHOENIX_OSTREAM PHOENIX_STD::_IO_ostream_withassign + #endif +#else +// #if (defined(__ICL) && defined(_STLPORT_VERSION)) +// #define PHOENIX_OSTREAM ostream_withassign +// #else + #define PHOENIX_OSTREAM PHOENIX_STD::ostream +// #endif +#endif + +////////////////////////////////// +#if defined(__GNUC__) && (__GNUC__ < 3) +// || (defined(__ICL) && defined(_STLPORT_VERSION)) +template <typename T1> +struct binary_operator<shift_l_op, PHOENIX_OSTREAM, T1> +{ + typedef PHOENIX_STD::ostream& result_type; + static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs) + { return out << rhs; } +}; +#endif + +////////////////////////////////// +template <typename T1> +struct binary_operator<shift_l_op, PHOENIX_STD::ostream, T1> +{ + typedef PHOENIX_STD::ostream& result_type; + static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs) + { return out << rhs; } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary3 + <shift_l_op, variable<PHOENIX_OSTREAM>, BaseT>::type +operator<<(PHOENIX_OSTREAM& _0, actor<BaseT> const& _1) +{ + return impl::make_binary3 + <shift_l_op, variable<PHOENIX_OSTREAM>, BaseT> + ::construct(var(_0), _1); +} + +#undef PHOENIX_OSTREAM + +/////////////////////////////////////////////////////////////////////////////// +// +// specializations for std::strstream / stringstream +// +/////////////////////////////////////////////////////////////////////////////// +template <typename T1> +struct binary_operator<shift_r_op, PHOENIX_STD::PHOENIX_SSTREAM, T1> +{ + typedef PHOENIX_STD::istream& result_type; + static result_type eval(PHOENIX_STD::istream& out, T1& rhs) + { return out >> rhs; } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary3 + <shift_r_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>::type +operator>>(PHOENIX_STD::PHOENIX_SSTREAM& _0, actor<BaseT> const& _1) +{ + return impl::make_binary3 + <shift_r_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT> + ::construct(var(_0), _1); +} + +////////////////////////////////// +template <typename T1> +struct binary_operator<shift_l_op, PHOENIX_STD::PHOENIX_SSTREAM, T1> +{ + typedef PHOENIX_STD::ostream& result_type; + static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs) + { return out << rhs; } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary3 + <shift_l_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>::type +operator<<(PHOENIX_STD::PHOENIX_SSTREAM& _0, actor<BaseT> const& _1) +{ + return impl::make_binary3 + <shift_l_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT> + ::construct(var(_0), _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// I/O manipulator specializations +// +/////////////////////////////////////////////////////////////////////////////// +#if (!defined(__GNUC__) || (__GNUC__ > 2)) +// && !(defined(__ICL) && defined(_STLPORT_VERSION)) + +typedef PHOENIX_STD::ios_base& (*iomanip_t)(PHOENIX_STD::ios_base&); +typedef PHOENIX_STD::istream& (*imanip_t)(PHOENIX_STD::istream&); +typedef PHOENIX_STD::ostream& (*omanip_t)(PHOENIX_STD::ostream&); + +#if defined(__BORLANDC__) + +/////////////////////////////////////////////////////////////////////////////// +// +// Borland does not like i/o manipulators functions such as endl to +// be the rhs of a lazy << operator (Borland incorrectly reports +// ambiguity). To get around the problem, we provide function +// pointer versions of the same name with a single trailing +// underscore. +// +// You can use the same trick for other i/o manipulators. +// Alternatively, you can prefix the manipulator with a '&' +// operator. Example: +// +// cout << arg1 << &endl +// +/////////////////////////////////////////////////////////////////////////////// + +imanip_t ws_ = &PHOENIX_STD::ws; +iomanip_t dec_ = &PHOENIX_STD::dec; +iomanip_t hex_ = &PHOENIX_STD::hex; +iomanip_t oct_ = &PHOENIX_STD::oct; +omanip_t endl_ = &PHOENIX_STD::endl; +omanip_t ends_ = &PHOENIX_STD::ends; +omanip_t flush_ = &PHOENIX_STD::flush; + +#else // __BORLANDC__ + +/////////////////////////////////////////////////////////////////////////////// +// +// The following are overloads for I/O manipulators. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary1<shift_l_op, BaseT, imanip_t>::type +operator>>(actor<BaseT> const& _0, imanip_t _1) +{ + return impl::make_binary1<shift_l_op, BaseT, imanip_t>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary1<shift_l_op, BaseT, iomanip_t>::type +operator>>(actor<BaseT> const& _0, iomanip_t _1) +{ + return impl::make_binary1<shift_l_op, BaseT, iomanip_t>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary1<shift_l_op, BaseT, omanip_t>::type +operator<<(actor<BaseT> const& _0, omanip_t _1) +{ + return impl::make_binary1<shift_l_op, BaseT, omanip_t>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_binary1<shift_l_op, BaseT, iomanip_t>::type +operator<<(actor<BaseT> const& _0, iomanip_t _1) +{ + return impl::make_binary1<shift_l_op, BaseT, iomanip_t>::construct(_0, _1); +} + +#endif // __BORLANDC__ +#endif // !defined(__GNUC__) || (__GNUC__ > 2) + +/////////////////////////////////////////////////////////////////////////////// +// +// specializations for stl iterators and containers +// +/////////////////////////////////////////////////////////////////////////////// +template <typename T> +struct unary_operator<dereference_op, T> +{ + typedef typename T::reference result_type; + static result_type eval(T const& iter) + { return *iter; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<index_op, T0, T1> +{ + typedef typename T0::reference result_type; + static result_type eval(T0& container, T1 const& index) + { return container[index]; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<index_op, T0 const, T1> +{ + typedef typename T0::const_reference result_type; + static result_type eval(T0 const& container, T1 const& index) + { return container[index]; } +}; + +/////////////////////////////////////////////////////////////////////////////// +} // namespace phoenix + +#undef PHOENIX_SSTREAM +#undef PHOENIX_STD +#endif