| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | /*-----------------------------------------------------------------------------+    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>::typeis_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>::typeclear(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>::typeiterative_size(const Type& object){     return object.size(); }//==============================================================================//= Swap//==============================================================================template<class Type>typename enable_if<is_container<Type>, void>::typeswap(Type& left, Type& right){    left.swap(right);}//==============================================================================//= Iteration//==============================================================================template<class Type>typename enable_if<is_container<Type>, typename Type::iterator>::typecyclic_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>::typecyclic_prior(const Type& object, typename Type::const_iterator it_){ return it_ == object.begin() ? object.end() : --it_; }}} // namespace boost icl#endif
 |