You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
87 lines
2.7 KiB
87 lines
2.7 KiB
/*-----------------------------------------------------------------------------+ |
|
Copyright (c) 2010-2010: Joachim Faulhaber |
|
+------------------------------------------------------------------------------+ |
|
Distributed under the Boost Software License, Version 1.0. |
|
(See accompanying file LICENCE.txt or copy at |
|
http://www.boost.org/LICENSE_1_0.txt) |
|
+-----------------------------------------------------------------------------*/ |
|
#ifndef BOOST_ICL_CONCEPT_CONTAINER_HPP_JOFA_100923 |
|
#define BOOST_ICL_CONCEPT_CONTAINER_HPP_JOFA_100923 |
|
|
|
#include <boost/utility/enable_if.hpp> |
|
#include <boost/mpl/and.hpp> |
|
#include <boost/mpl/not.hpp> |
|
#include <boost/icl/type_traits/is_container.hpp> |
|
#include <boost/icl/type_traits/is_icl_container.hpp> |
|
|
|
namespace boost{ namespace icl |
|
{ |
|
|
|
//============================================================================== |
|
//= Emptieness |
|
//============================================================================== |
|
|
|
/** Tests if the container is empty. |
|
Complexity: constant. */ |
|
template<class Type> |
|
typename enable_if<is_container<Type>, bool>::type |
|
is_empty(const Type& object) |
|
{ |
|
return object.begin()==object.end(); |
|
} |
|
|
|
|
|
/** All content of the container is dropped. |
|
Complexity: linear. */ |
|
template<class Type> |
|
typename enable_if<is_container<Type>, void>::type |
|
clear(Type& object) |
|
{ |
|
object.erase(object.begin(), object.end()); |
|
} |
|
|
|
//============================================================================== |
|
//= Size |
|
//============================================================================== |
|
|
|
template<class Type> |
|
typename enable_if<mpl::and_< is_container<Type> |
|
, mpl::not_<is_icl_container<Type> > > |
|
, std::size_t>::type |
|
iterative_size(const Type& object) |
|
{ |
|
return object.size(); |
|
} |
|
|
|
//============================================================================== |
|
//= Swap |
|
//============================================================================== |
|
|
|
template<class Type> |
|
typename enable_if<is_container<Type>, void>::type |
|
swap(Type& left, Type& right) |
|
{ |
|
left.swap(right); |
|
} |
|
|
|
//============================================================================== |
|
//= Iteration |
|
//============================================================================== |
|
|
|
template<class Type> |
|
typename enable_if<is_container<Type>, typename Type::iterator>::type |
|
cyclic_prior(Type& object, typename Type::iterator it_) |
|
{ return it_ == object.begin() ? object.end() : --it_; } |
|
|
|
template<class Type> |
|
typename enable_if<is_container<Type>, typename Type::const_iterator>::type |
|
cyclic_prior(const Type& object, typename Type::const_iterator it_) |
|
{ return it_ == object.begin() ? object.end() : --it_; } |
|
|
|
|
|
|
|
}} // namespace boost icl |
|
|
|
#endif |
|
|
|
|
|
|