cradle::iterating_range and cradle::range::iterating

Author: Cryolite
Contact: cryolite dot indigo atmark gmail dot com
Date: 2006/11/28
Copyright: Copyright Cryolite 2006. 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)

Abstract

関数オブジェクト f と初期値 x が与えられたとき, 最初の要素が x であり,かつ各要素が前の要素に f を適用した結果の値として定義されるような range の実装を 提供する.


Header

<cradle/range/iterating.hpp>


Synopsis

namespace cradle{

template< /* unspecified template parameters, see below */ >
class iterating_range
  : private cradle::nonassignable // exposition only
{
public:
  typedef /* see below */ value_type;
  typedef /* see below */ size_type;
  typedef /* see below */ difference_type;

  class iterator;
  typedef iterator const_iterator;

  iterating_range( /* unspecified parameters, see below */ );

  const_iterator begin() const;

  const_iterator end() const;

  bool empty() const;

  functor_type functor() const;
}; // class iterating_range

namespace range{

// The followings are just exposed.
struct iterating_evaluator
{
  template< /* unspecified template parameters */ >
  struct result;

  template< /* unspecified template parameters, see below */ >
  iterating_range< /* unspecified template arguments, see below */ >
  operator()( /* unspecified parameters, see below */ ) const;
}; // struct counting_evaluator
// End of exposition.

iterating_evaluator const iterating = iterating_evaluator();

} // namespace range

} // namespace cradle

iterating_range Template Parameters

本クラステンプレートは positional/named/default template parameters を サポートする.各 position, name, default の詳細は以下の表のとおり.

Parameter name Position Name tag Default
FunctorType 0 cradle::range::params::functor_is n/a
InitialValueType 1 cradle::range::params::initial_value_is n/a
SizeType 2 cradle::range::params::size_type_is std::size_t
FunctionType
現在の要素から次の要素を得るための関数オブジェクトの型を指定する.
InitialValueType
初期値の型を指定する. ここで指定した方が, 直接 range の value_type となるとは限らない.
SizeType
range のサイズ型を指定する.

Requirements on Template Parameters

Requirements on FunctorType

  • FunctorType は Copy Constructible コンセプトのモデルで なければならない.
  • FunctorType は Adaptable Function コンセプト (needs to be documented) のモデルでなければならない.
  • FunctorTypevalue_type (後述) のオブジェクトを受け, value_type のオブジェクトを返す1項の関数オブジェクトで なければならない

Requirements on InitialValueType

  • InitialValueType は Copy Contructible コンセプトのモデルで なければならない.

Requirements on SizeType

  • SizeType は符号無しの integral type (3.9.1/7)でなければならない.

Related Traits for Template Parameters

  • cradle::functional::is_pure< FunctorType >::type

cradle::iterating_range Types


iterating_range Models


iterating_range Valid Expressions


Examples

std::vector< int > v;
range::assign(
    range::iterating( range::params::size = 5
                    , range::params::initial_value = 1
                    , range::params::functor = bll::_1 * 2 )
  , v );
// v = {1,2,4,8,16}
std::vector< fs::path > v;
range::assign(
    range::iterate( range::initial_value = fs::path( "/foo/bar/bz" )
                  , range::functor = cfs::path_branch( bll::_1 ) )
      | view::take_while( !path_empty( bll::_1 ) )
  , v );
// v = { fs::path( "/foo/bar/baz" )
//     , fs::path( "/foo/bar" )
//     , fs::path( "/foo" )
//     , fs::path( "/" ) };
range::copy(
    range::iterating( range::initial_value = 24
                    , range::functor = _1 % 2 == 0 ? _1 / 2 : _1 * 3 + 1 )
      | range::took_while( _1 != 1 )
  , std::ostream_iterator< int >( std::cout, "\n" ) );