1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*=============================================================================
- Copyright (c) 1999-2003 Jaakko Jarvi
- Copyright (c) 1999-2003 Jeremiah Willcock
- Copyright (c) 2001-2011 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_IN_05052005_0121)
- #define FUSION_IN_05052005_0121
- #include <boost/fusion/support/config.hpp>
- #include <istream>
- #include <boost/fusion/sequence/io/detail/manip.hpp>
- #include <boost/mpl/bool.hpp>
- #include <boost/fusion/sequence/intrinsic/begin.hpp>
- #include <boost/fusion/sequence/intrinsic/end.hpp>
- #include <boost/fusion/iterator/deref.hpp>
- #include <boost/fusion/iterator/next.hpp>
- #include <boost/fusion/iterator/equal_to.hpp>
- namespace boost { namespace fusion { namespace detail
- {
- template <typename Tag>
- struct delimiter_in
- {
- // read a delimiter
- template <typename IS>
- static void
- read(IS& is, char const* delim, mpl::false_ = mpl::false_())
- {
- detail::string_ios_manip<Tag, IS> manip(is);
- manip.read(delim);
- }
- template <typename IS>
- static void
- read(IS&, char const*, mpl::true_)
- {
- }
- };
- struct read_sequence_loop
- {
- template <typename IS, typename First, typename Last>
- static void
- call(IS&, First const&, Last const&, mpl::true_)
- {
- }
- template <typename IS, typename First, typename Last>
- static void
- call(IS& is, First const& first, Last const& last, mpl::false_)
- {
- result_of::equal_to<
- typename result_of::next<First>::type
- , Last
- >
- is_last;
- is >> *first;
- delimiter_in<tuple_delimiter_tag>::read(is, " ", is_last);
- call(is, fusion::next(first), last, is_last);
- }
- template <typename IS, typename First, typename Last>
- static void
- call(IS& is, First const& first, Last const& last)
- {
- result_of::equal_to<First, Last> eq;
- call(is, first, last, eq);
- }
- };
- template <typename IS, typename Sequence>
- inline void
- read_sequence(IS& is, Sequence& seq)
- {
- delimiter_in<tuple_open_tag>::read(is, "(");
- read_sequence_loop::call(is, fusion::begin(seq), fusion::end(seq));
- delimiter_in<tuple_close_tag>::read(is, ")");
- }
- }}}
- #endif
|