mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-25 01:57:15 +02:00
segmented_size, for calculating the size of any segmented data structure
[SVN r35945]
This commit is contained in:
55
include/boost/fusion/sequence/intrinsic/ext_/size_s.hpp
Executable file
55
include/boost/fusion/sequence/intrinsic/ext_/size_s.hpp
Executable file
@ -0,0 +1,55 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2006 Eric Niebler
|
||||
|
||||
Use, modification and distribution is subject to 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_SIZE_S_08112006_1141)
|
||||
#define FUSION_SIZE_S_08112006_1141
|
||||
|
||||
#include <boost/mpl/plus.hpp>
|
||||
#include <boost/mpl/size_t.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
#include <boost/fusion/algorithm/iteration/fold.hpp>
|
||||
#include <boost/fusion/support/ext_/is_segmented.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/ext_/segments.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// calculates the size of any segmented data structure.
|
||||
template<typename Sequence, bool IsSegmented = traits::is_segmented<Sequence>::value>
|
||||
struct segmented_size;
|
||||
|
||||
namespace detail
|
||||
{
|
||||
struct size_plus
|
||||
{
|
||||
template<typename Seq, typename State>
|
||||
struct result
|
||||
: mpl::plus<
|
||||
segmented_size<typename remove_reference<Seq>::type>
|
||||
, State
|
||||
>
|
||||
{};
|
||||
};
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
template<typename Sequence, bool IsSegmented>
|
||||
struct segmented_size
|
||||
: result_of::fold<
|
||||
typename result_of::segments<Sequence>::type
|
||||
, mpl::size_t<0>
|
||||
, detail::size_plus
|
||||
>::type
|
||||
{};
|
||||
|
||||
template<typename Sequence>
|
||||
struct segmented_size<Sequence, false>
|
||||
: result_of::size<Sequence>
|
||||
{};
|
||||
}}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user