forked from boostorg/fusion
progress with integrating the segmented Fusion work
[SVN r73831]
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
/*=============================================================================
|
||||
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_BEGIN_HPP_INCLUDED)
|
||||
#define BOOST_FUSION_SEGMENTED_BEGIN_HPP_INCLUDED
|
||||
|
||||
#include <boost/fusion/iterator/segmented_iterator/detail/begin_impl.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
template<typename Context>
|
||||
struct segmented_iterator;
|
||||
|
||||
//auto segmented_begin( rng )
|
||||
//{
|
||||
// return make_segmented_iterator( segmented_begin_impl( rng, nil ) );
|
||||
//}
|
||||
|
||||
template<typename Range>
|
||||
struct segmented_begin
|
||||
{
|
||||
typedef
|
||||
segmented_iterator<
|
||||
typename detail::segmented_begin_impl<Range, fusion::nil>::type
|
||||
>
|
||||
type;
|
||||
|
||||
static type call(Range & rng)
|
||||
{
|
||||
return type(
|
||||
detail::segmented_begin_impl<Range, fusion::nil>::call(rng, fusion::nil()));
|
||||
}
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
@@ -0,0 +1,41 @@
|
||||
/*=============================================================================
|
||||
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_END_HPP_INCLUDED)
|
||||
#define BOOST_FUSION_SEGMENTED_END_HPP_INCLUDED
|
||||
|
||||
#include <boost/fusion/container/list/cons.hpp>
|
||||
#include <boost/fusion/iterator/segmented_iterator/detail/end_impl.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
template<typename Context>
|
||||
struct segmented_iterator;
|
||||
|
||||
//auto segmented_end( rng )
|
||||
//{
|
||||
// return make_segmented_iterator( segmented_end_impl( rng ) );
|
||||
//}
|
||||
|
||||
template<typename Range>
|
||||
struct segmented_end
|
||||
{
|
||||
typedef
|
||||
segmented_iterator<
|
||||
typename detail::segmented_end_impl<Range, fusion::nil>::type
|
||||
>
|
||||
type;
|
||||
|
||||
static type call(Range & rng)
|
||||
{
|
||||
return type(
|
||||
detail::segmented_end_impl<Range, fusion::nil>::call(rng, fusion::nil()));
|
||||
}
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
@@ -0,0 +1,60 @@
|
||||
/*=============================================================================
|
||||
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_SIZE_08112006_1141)
|
||||
#define BOOST_FUSION_SEGMENTED_SIZE_08112006_1141
|
||||
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
#include <boost/mpl/fold.hpp>
|
||||
#include <boost/mpl/plus.hpp>
|
||||
#include <boost/mpl/size_t.hpp>
|
||||
#include <boost/mpl/placeholders.hpp>
|
||||
#include <boost/fusion/mpl/begin.hpp>
|
||||
#include <boost/fusion/mpl/end.hpp>
|
||||
#include <boost/fusion/mpl/clear.hpp>
|
||||
#include <boost/fusion/mpl/push_front.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/size.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/segments.hpp>
|
||||
#include <boost/fusion/support/is_segmented.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// calculates the size of any segmented data structure.
|
||||
template<typename Sequence>
|
||||
struct segmented_size;
|
||||
|
||||
namespace detail
|
||||
{
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
template<typename Sequence, bool IsSegmented = traits::is_segmented<Sequence>::value>
|
||||
struct segmented_size_impl
|
||||
: mpl::fold<
|
||||
typename remove_reference<
|
||||
typename add_const<
|
||||
typename result_of::segments<Sequence>::type
|
||||
>::type
|
||||
>::type,
|
||||
mpl::size_t<0>,
|
||||
mpl::plus<mpl::_1, segmented_size<mpl::_2> >
|
||||
>::type
|
||||
{};
|
||||
|
||||
template<typename Sequence>
|
||||
struct segmented_size_impl<Sequence, false>
|
||||
: result_of::size<Sequence>::type
|
||||
{};
|
||||
}
|
||||
|
||||
template<typename Sequence>
|
||||
struct segmented_size
|
||||
: detail::segmented_size_impl<Sequence>
|
||||
{};
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user