37f5c22da9
[SVN r61449]
73 lines
1.8 KiB
C++
73 lines
1.8 KiB
C++
// noncopyable.cpp
|
|
///
|
|
// (C) Copyright Eric Niebler 2004.
|
|
// Use, modification and distribution are 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)
|
|
|
|
/*
|
|
Revision history:
|
|
21 December 2005 : Initial version.
|
|
*/
|
|
|
|
#include <vector>
|
|
#include <boost/foreach.hpp>
|
|
#include <boost/noncopyable.hpp>
|
|
#include <boost/range/iterator_range.hpp>
|
|
|
|
struct noncopy_vector
|
|
: std::vector<int>
|
|
, private boost::noncopyable
|
|
{
|
|
noncopy_vector() { }
|
|
};
|
|
|
|
struct noncopy_range
|
|
: boost::iterator_range<noncopy_vector::iterator>
|
|
, private boost::noncopyable
|
|
{
|
|
noncopy_range() { }
|
|
};
|
|
|
|
// Tell FOREACH that noncopy_vector and noncopy_range are non-copyable.
|
|
// NOTE: this is only necessary if
|
|
// a) your type does not inherit from boost::noncopyable, OR
|
|
// b) Boost.Config defines BOOST_BROKEN_IS_BASE_AND_DERIVED for your compiler
|
|
#ifdef BOOST_BROKEN_IS_BASE_AND_DERIVED
|
|
inline boost::mpl::true_ *boost_foreach_is_noncopyable(noncopy_vector *&, boost::foreach::tag)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
inline boost::mpl::true_ *boost_foreach_is_noncopyable(noncopy_range *&, boost::foreach::tag)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
// tell FOREACH that noncopy_range is a lightweight proxy object
|
|
inline boost::mpl::true_ *boost_foreach_is_lightweight_proxy(noncopy_range *&, boost::foreach::tag)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// main
|
|
//
|
|
int main( int, char*[] )
|
|
{
|
|
noncopy_vector v1;
|
|
BOOST_FOREACH( int & i, v1 ) { (void)i; }
|
|
|
|
noncopy_vector const v2;
|
|
BOOST_FOREACH( int const & j, v2 ) { (void)j; }
|
|
|
|
noncopy_range rng1;
|
|
BOOST_FOREACH( int & k, rng1 ) { (void)k; }
|
|
|
|
noncopy_range const rng2;
|
|
BOOST_FOREACH( int & l, rng2 ) { (void)l; }
|
|
|
|
return 0;
|
|
}
|