| Index: third_party/boost/boost/fusion/sequence/io/detail/manip.hpp
|
| diff --git a/third_party/boost/boost/fusion/sequence/io/detail/manip.hpp b/third_party/boost/boost/fusion/sequence/io/detail/manip.hpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dd9a52659bd84696facb02ff60c19a82c1326f6a
|
| --- /dev/null
|
| +++ b/third_party/boost/boost/fusion/sequence/io/detail/manip.hpp
|
| @@ -0,0 +1,316 @@
|
| +/*=============================================================================
|
| + Copyright (c) 1999-2003 Jeremiah Willcock
|
| + Copyright (c) 1999-2003 Jaakko Jarvi
|
| + Copyright (c) 2001-2006 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)
|
| +==============================================================================*/
|
| +#if !defined(FUSION_MANIP_05052005_1200)
|
| +#define FUSION_MANIP_05052005_1200
|
| +
|
| +#include <boost/config.hpp>
|
| +#include <string>
|
| +#include <vector>
|
| +#include <cctype>
|
| +
|
| +// Tuple I/O manipulators
|
| +
|
| +#define FUSION_GET_CHAR_TYPE(T) typename T::char_type
|
| +#define FUSION_GET_TRAITS_TYPE(T) typename T::traits_type
|
| +
|
| +#if defined (BOOST_NO_TEMPLATED_STREAMS)
|
| +#define FUSION_STRING_OF_STREAM(Stream) std::string
|
| +#else
|
| +#define FUSION_STRING_OF_STREAM(Stream) \
|
| + std::basic_string< \
|
| + FUSION_GET_CHAR_TYPE(Stream) \
|
| + , FUSION_GET_TRAITS_TYPE(Stream) \
|
| + >
|
| +#endif
|
| +
|
| +//$$$ these should be part of the public API$$$
|
| +//$$$ rename tuple_open, tuple_close and tuple_delimiter to
|
| +// open, close and delimeter and add these synonyms to the
|
| +// TR1 tuple module.
|
| +
|
| +namespace boost { namespace fusion
|
| +{
|
| + namespace detail
|
| + {
|
| + template <typename Tag>
|
| + int get_xalloc_index(Tag* = 0)
|
| + {
|
| + // each Tag will have a unique index
|
| + static int index = std::ios::xalloc();
|
| + return index;
|
| + }
|
| +
|
| + template <typename Stream, typename Tag, typename T>
|
| + struct stream_data
|
| + {
|
| + struct arena
|
| + {
|
| + ~arena()
|
| + {
|
| + for (
|
| + typename std::vector<T*>::iterator i = data.begin()
|
| + ; i != data.end()
|
| + ; ++i)
|
| + {
|
| + delete *i;
|
| + }
|
| + }
|
| +
|
| + std::vector<T*> data;
|
| + };
|
| +
|
| + static void attach(Stream& stream, T const& data)
|
| + {
|
| + static arena ar; // our arena
|
| + ar.data.push_back(new T(data));
|
| + stream.pword(get_xalloc_index<Tag>()) = ar.data.back();
|
| + }
|
| +
|
| + static T const* get(Stream& stream)
|
| + {
|
| + return (T const*)stream.pword(get_xalloc_index<Tag>());
|
| + }
|
| + };
|
| +
|
| + template <typename Tag, typename Stream>
|
| + class string_ios_manip
|
| + {
|
| + public:
|
| +
|
| + typedef FUSION_STRING_OF_STREAM(Stream) string_type;
|
| +
|
| + typedef stream_data<Stream, Tag, string_type> stream_data_t;
|
| +
|
| + string_ios_manip(Stream& str_)
|
| + : stream(str_)
|
| + {}
|
| +
|
| + void
|
| + set(string_type const& s)
|
| + {
|
| + stream_data_t::attach(stream, s);
|
| + }
|
| +
|
| + void
|
| + print(char const* default_) const
|
| + {
|
| + // print a delimiter
|
| + string_type const* p = stream_data_t::get(stream);
|
| + if (p)
|
| + stream << *p;
|
| + else
|
| + stream << default_;
|
| + }
|
| +
|
| + void
|
| + read(char const* default_) const
|
| + {
|
| + // read a delimiter
|
| + string_type const* p = stream_data_t::get(stream);
|
| + using namespace std;
|
| + ws(stream);
|
| +
|
| + if (p)
|
| + {
|
| + typedef typename string_type::const_iterator iterator;
|
| + for (iterator i = p->begin(); i != p->end(); ++i)
|
| + check_delim(*i);
|
| + }
|
| + else
|
| + {
|
| + while (*default_)
|
| + check_delim(*default_++);
|
| + }
|
| + }
|
| +
|
| + private:
|
| +
|
| + template <typename Char>
|
| + void
|
| + check_delim(Char c) const
|
| + {
|
| + if (!isspace(c))
|
| + {
|
| + if (stream.get() != c)
|
| + {
|
| + stream.unget();
|
| + stream.setstate(std::ios::failbit);
|
| + }
|
| + }
|
| + }
|
| +
|
| + Stream& stream;
|
| + };
|
| +
|
| + } // detail
|
| +
|
| +#if defined (BOOST_NO_TEMPLATED_STREAMS)
|
| +
|
| +#define STD_TUPLE_DEFINE_MANIPULATOR(name) \
|
| + namespace detail \
|
| + { \
|
| + struct name##_tag; \
|
| + \
|
| + struct name##_type \
|
| + { \
|
| + typedef std::string string_type; \
|
| + string_type data; \
|
| + name##_type(const string_type& d): data(d) {} \
|
| + }; \
|
| + \
|
| + template <typename Stream> \
|
| + Stream& operator>>(Stream& s, const name##_type& m) \
|
| + { \
|
| + string_ios_manip<name##_tag, Stream>(s).set(m.data); \
|
| + return s; \
|
| + } \
|
| + \
|
| + template <typename Stream> \
|
| + Stream& operator<<(Stream& s, const name##_type& m) \
|
| + { \
|
| + string_ios_manip<name##_tag, Stream>(s).set(m.data); \
|
| + return s; \
|
| + } \
|
| + }
|
| +
|
| +#define STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(name) \
|
| + inline detail::name##_type \
|
| + name(const std::string& s) \
|
| + { \
|
| + return detail::name##_type(s); \
|
| + } \
|
| + \
|
| + inline detail::name##_type \
|
| + name(const char* s) \
|
| + { \
|
| + return detail::name##_type(std::string(s)); \
|
| + } \
|
| + \
|
| + inline detail::name##_type \
|
| + name(char c) \
|
| + { \
|
| + return detail::name##_type(std::string(1, c)); \
|
| + }
|
| +
|
| +#else // defined(BOOST_NO_TEMPLATED_STREAMS)
|
| +
|
| +#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
| +
|
| +#define STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(name) \
|
| + template <typename Char, typename Traits> \
|
| + inline detail::name##_type<Char, Traits> \
|
| + name(const std::basic_string<Char, Traits>& s) \
|
| + { \
|
| + return detail::name##_type<Char, Traits>(s); \
|
| + } \
|
| + \
|
| + inline detail::name##_type<char> \
|
| + name(char const* s) \
|
| + { \
|
| + return detail::name##_type<char>(std::basic_string<char>(s)); \
|
| + } \
|
| + \
|
| + inline detail::name##_type<wchar_t> \
|
| + name(wchar_t const* s) \
|
| + { \
|
| + return detail::name##_type<wchar_t>(std::basic_string<wchar_t>(s)); \
|
| + } \
|
| + \
|
| + inline detail::name##_type<char> \
|
| + name(char c) \
|
| + { \
|
| + return detail::name##_type<char>(std::basic_string<char>(1, c)); \
|
| + } \
|
| + \
|
| + inline detail::name##_type<wchar_t> \
|
| + name(wchar_t c) \
|
| + { \
|
| + return detail::name##_type<wchar_t>(std::basic_string<wchar_t>(1, c)); \
|
| + }
|
| +
|
| +#else // defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
|
| +
|
| +#define STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(name) \
|
| + template <typename Char, typename Traits> \
|
| + inline detail::name##_type<Char, Traits> \
|
| + name(const std::basic_string<Char, Traits>& s) \
|
| + { \
|
| + return detail::name##_type<Char, Traits>(s); \
|
| + } \
|
| + \
|
| + template <typename Char> \
|
| + inline detail::name##_type<Char> \
|
| + name(Char s[]) \
|
| + { \
|
| + return detail::name##_type<Char>(std::basic_string<Char>(s)); \
|
| + } \
|
| + \
|
| + template <typename Char> \
|
| + inline detail::name##_type<Char> \
|
| + name(Char const s[]) \
|
| + { \
|
| + return detail::name##_type<Char>(std::basic_string<Char>(s)); \
|
| + } \
|
| + \
|
| + template <typename Char> \
|
| + inline detail::name##_type<Char> \
|
| + name(Char c) \
|
| + { \
|
| + return detail::name##_type<Char>(std::basic_string<Char>(1, c)); \
|
| + }
|
| +
|
| +#endif
|
| +
|
| +#define STD_TUPLE_DEFINE_MANIPULATOR(name) \
|
| + namespace detail \
|
| + { \
|
| + struct name##_tag; \
|
| + \
|
| + template <typename Char, typename Traits = std::char_traits<Char> > \
|
| + struct name##_type \
|
| + { \
|
| + typedef std::basic_string<Char, Traits> string_type; \
|
| + string_type data; \
|
| + name##_type(const string_type& d): data(d) {} \
|
| + }; \
|
| + \
|
| + template <typename Stream, typename Char, typename Traits> \
|
| + Stream& operator>>(Stream& s, const name##_type<Char,Traits>& m) \
|
| + { \
|
| + string_ios_manip<name##_tag, Stream>(s).set(m.data); \
|
| + return s; \
|
| + } \
|
| + \
|
| + template <typename Stream, typename Char, typename Traits> \
|
| + Stream& operator<<(Stream& s, const name##_type<Char,Traits>& m) \
|
| + { \
|
| + string_ios_manip<name##_tag, Stream>(s).set(m.data); \
|
| + return s; \
|
| + } \
|
| + } \
|
| +
|
| +#endif // defined(BOOST_NO_TEMPLATED_STREAMS)
|
| +
|
| + STD_TUPLE_DEFINE_MANIPULATOR(tuple_open)
|
| + STD_TUPLE_DEFINE_MANIPULATOR(tuple_close)
|
| + STD_TUPLE_DEFINE_MANIPULATOR(tuple_delimiter)
|
| +
|
| + STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(tuple_open)
|
| + STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(tuple_close)
|
| + STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(tuple_delimiter)
|
| +
|
| +#undef STD_TUPLE_DEFINE_MANIPULATOR
|
| +#undef STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS
|
| +#undef FUSION_STRING_OF_STREAM
|
| +#undef FUSION_GET_CHAR_TYPE
|
| +#undef FUSION_GET_TRAITS_TYPE
|
| +
|
| +}}
|
| +
|
| +#endif
|
|
|