diff options
author | Kevin Smith <git@kismith.co.uk> | 2013-01-12 18:41:34 (GMT) |
---|---|---|
committer | Swift Review <review@swift.im> | 2013-01-13 10:36:26 (GMT) |
commit | f3bc816af1b0d61452de973963e453bf3b3f95a2 (patch) | |
tree | e895f8afa3580e6cff6f5ad2017d45bf147a17c2 /3rdParty/Boost/src/boost/fusion/iterator/detail/segmented_iterator.hpp | |
parent | 188fc285c6555eadd3c9d50ab8a94adcade78d89 (diff) | |
download | swift-f3bc816af1b0d61452de973963e453bf3b3f95a2.zip swift-f3bc816af1b0d61452de973963e453bf3b3f95a2.tar.bz2 |
Adding in the spirit Boost stuff
Change-Id: I4f127ce61667243b64081b0aa309028d5077045f
Diffstat (limited to '3rdParty/Boost/src/boost/fusion/iterator/detail/segmented_iterator.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/fusion/iterator/detail/segmented_iterator.hpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/fusion/iterator/detail/segmented_iterator.hpp b/3rdParty/Boost/src/boost/fusion/iterator/detail/segmented_iterator.hpp new file mode 100644 index 0000000..ccd45fb --- /dev/null +++ b/3rdParty/Boost/src/boost/fusion/iterator/detail/segmented_iterator.hpp @@ -0,0 +1,144 @@ +/*============================================================================= + Copyright (c) 2011 Eric Niebler + + 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(BOOST_FUSION_SEGMENTED_ITERATOR_SEGMENTED_ITERATOR_HPP_INCLUDED) +#define BOOST_FUSION_SEGMENTED_ITERATOR_SEGMENTED_ITERATOR_HPP_INCLUDED + +#include <boost/mpl/bool.hpp> +#include <boost/fusion/sequence/intrinsic_fwd.hpp> +#include <boost/fusion/iterator/iterator_facade.hpp> +#include <boost/fusion/iterator/deref.hpp> +#include <boost/fusion/iterator/deref_data.hpp> +#include <boost/fusion/iterator/key_of.hpp> +#include <boost/fusion/iterator/value_of.hpp> +#include <boost/fusion/iterator/value_of_data.hpp> +#include <boost/fusion/iterator/detail/segmented_equal_to.hpp> + +namespace boost { namespace fusion +{ + struct nil; + + namespace detail + { + template <typename Stack> + struct segmented_next_impl; + } + + // A segmented iterator wraps a "context", which is a cons list + // of ranges, the frontmost is range over values and the rest + // are ranges over internal segments. + template <typename Context> + struct segmented_iterator + : iterator_facade<segmented_iterator<Context>, forward_traversal_tag> + { + explicit segmented_iterator(Context const& ctx) + : context(ctx) + {} + + //auto deref(it) + //{ + // return deref(begin(car(it.context))) + //} + template <typename It> + struct deref + { + typedef + typename result_of::deref< + typename It::context_type::car_type::begin_type + >::type + type; + + static type call(It const& it) + { + return *it.context.car.first; + } + }; + + //auto deref_data(it) + //{ + // return deref_data(begin(car(it.context))) + //} + template <typename It> + struct deref_data + { + typedef + typename result_of::deref_data< + typename It::context_type::car_type::begin_type + >::type + type; + + static type call(It const& it) + { + return fusion::deref_data(it.context.car.first); + } + }; + + //auto key_of(it) + //{ + // return key_of(begin(car(it.context))) + //} + template <typename It> + struct key_of + : result_of::key_of<typename It::context_type::car_type::begin_type> + {}; + + //auto value_of(it) + //{ + // return value_of(begin(car(it.context))) + //} + template <typename It> + struct value_of + : result_of::value_of<typename It::context_type::car_type::begin_type> + {}; + + //auto value_of_data(it) + //{ + // return value_of_data(begin(car(it.context))) + //} + template <typename It> + struct value_of_data + : result_of::value_of_data<typename It::context_type::car_type::begin_type> + {}; + + // Compare all the segment iterators in each stack, starting with + // the bottom-most. + template < + typename It1 + , typename It2 + , int Size1 = It1::context_type::size::value + , int Size2 = It2::context_type::size::value + > + struct equal_to + : mpl::false_ + {}; + + template <typename It1, typename It2, int Size> + struct equal_to<It1, It2, Size, Size> + : detail::segmented_equal_to< + typename It1::context_type + , typename It2::context_type + > + {}; + + template <typename It> + struct next + { + typedef detail::segmented_next_impl<typename It::context_type> impl; + typedef segmented_iterator<typename impl::type> type; + + static type call(It const& it) + { + return type(impl::call(it.context)); + } + }; + + typedef Context context_type; + context_type context; + }; + +}} + +#endif |