forked from boostorg/iterator
Disabled default construction for iterator archetypes that are not forward traversal iterators
[SVN r21781]
This commit is contained in:
@ -149,12 +149,23 @@ namespace detail
|
|||||||
template <class Derived,class Value> struct archetype;
|
template <class Derived,class Value> struct archetype;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Constructor argument for those iterators that
|
||||||
|
// are not default constructible
|
||||||
|
struct ctor_arg {};
|
||||||
|
|
||||||
template <class Derived, class Value, class TraversalCategory>
|
template <class Derived, class Value, class TraversalCategory>
|
||||||
struct traversal_archetype_
|
struct traversal_archetype_
|
||||||
: mpl::aux::msvc_eti_base<
|
: mpl::aux::msvc_eti_base<
|
||||||
typename traversal_archetype_impl<TraversalCategory>::template archetype<Derived,Value>
|
typename traversal_archetype_impl<TraversalCategory>::template archetype<Derived,Value>
|
||||||
>::type
|
>::type
|
||||||
{};
|
{
|
||||||
|
traversal_archetype_() {}
|
||||||
|
traversal_archetype_(ctor_arg arg)
|
||||||
|
: mpl::aux::msvc_eti_base<
|
||||||
|
typename traversal_archetype_impl<TraversalCategory>::template archetype<Derived,Value>
|
||||||
|
>::type(arg)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct traversal_archetype_impl<incrementable_traversal_tag>
|
struct traversal_archetype_impl<incrementable_traversal_tag>
|
||||||
@ -162,6 +173,8 @@ namespace detail
|
|||||||
template<class Derived, class Value>
|
template<class Derived, class Value>
|
||||||
struct archetype
|
struct archetype
|
||||||
{
|
{
|
||||||
|
explicit archetype(ctor_arg) {}
|
||||||
|
|
||||||
struct bogus { }; // This use to be void, but that causes trouble for iterator_facade. Need more research. -JGS
|
struct bogus { }; // This use to be void, but that causes trouble for iterator_facade. Need more research. -JGS
|
||||||
typedef bogus difference_type;
|
typedef bogus difference_type;
|
||||||
|
|
||||||
@ -178,6 +191,9 @@ namespace detail
|
|||||||
: public equality_comparable< traversal_archetype_<Derived, Value, single_pass_traversal_tag> >,
|
: public equality_comparable< traversal_archetype_<Derived, Value, single_pass_traversal_tag> >,
|
||||||
public traversal_archetype_<Derived, Value, incrementable_traversal_tag>
|
public traversal_archetype_<Derived, Value, incrementable_traversal_tag>
|
||||||
{
|
{
|
||||||
|
explicit archetype(ctor_arg arg)
|
||||||
|
: traversal_archetype_<Derived, Value, incrementable_traversal_tag>(arg)
|
||||||
|
{}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -198,6 +214,9 @@ namespace detail
|
|||||||
struct archetype
|
struct archetype
|
||||||
: public traversal_archetype_<Derived, Value, single_pass_traversal_tag>
|
: public traversal_archetype_<Derived, Value, single_pass_traversal_tag>
|
||||||
{
|
{
|
||||||
|
archetype()
|
||||||
|
: traversal_archetype_<Derived, Value, single_pass_traversal_tag>(ctor_arg())
|
||||||
|
{}
|
||||||
typedef std::ptrdiff_t difference_type;
|
typedef std::ptrdiff_t difference_type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -36,6 +36,7 @@ test-suite iterator
|
|||||||
[ run iterator_adaptor_cc.cpp ]
|
[ run iterator_adaptor_cc.cpp ]
|
||||||
[ run iterator_adaptor_test.cpp ]
|
[ run iterator_adaptor_test.cpp ]
|
||||||
[ compile iterator_archetype_cc.cpp ]
|
[ compile iterator_archetype_cc.cpp ]
|
||||||
|
[ compile-fail iterator_archetype_default_ctor.cpp ]
|
||||||
[ run transform_iterator_test.cpp ]
|
[ run transform_iterator_test.cpp ]
|
||||||
[ run indirect_iterator_test.cpp ]
|
[ run indirect_iterator_test.cpp ]
|
||||||
[ compile indirect_iterator_member_types.cpp ]
|
[ compile indirect_iterator_member_types.cpp ]
|
||||||
|
22
test/iterator_archetype_default_ctor.cpp
Executable file
22
test/iterator_archetype_default_ctor.cpp
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// Copyright Thomas Witt 2004. Permission to copy, use,
|
||||||
|
// modify, sell and distribute this software is granted provided this
|
||||||
|
// copyright notice appears in all copies. This software is provided
|
||||||
|
// "as is" without express or implied warranty, and with no claim as
|
||||||
|
// to its suitability for any purpose.
|
||||||
|
//
|
||||||
|
#include <boost/iterator/iterator_archetypes.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
typedef boost::iterator_archetype<
|
||||||
|
int
|
||||||
|
, boost::iterator_archetypes::readable_iterator_t
|
||||||
|
, boost::single_pass_traversal_tag
|
||||||
|
> iter;
|
||||||
|
|
||||||
|
// single_pass_traversal iterators are not required to be
|
||||||
|
// default constructible
|
||||||
|
iter it;
|
||||||
|
}
|
Reference in New Issue
Block a user