X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=boost_ext%2Fboost%2Fbimap%2Fcontainer_adaptor%2Fsequence_container_adaptor.hpp;fp=boost_ext%2Fboost%2Fbimap%2Fcontainer_adaptor%2Fsequence_container_adaptor.hpp;h=396635d3c4d7f9be193ea7acbda2c909846d2b11;hb=4123b4fe58a7fd4659fa01476581690b47c83600;hp=0000000000000000000000000000000000000000;hpb=79564b90f6c9f7cd0bc5b11a6146bb7067b11a75;p=senf.git diff --git a/boost_ext/boost/bimap/container_adaptor/sequence_container_adaptor.hpp b/boost_ext/boost/bimap/container_adaptor/sequence_container_adaptor.hpp new file mode 100644 index 0000000..396635d --- /dev/null +++ b/boost_ext/boost/bimap/container_adaptor/sequence_container_adaptor.hpp @@ -0,0 +1,355 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// 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) + +/// \file container_adaptor/sequence_container_adaptor.hpp +/// \brief Container adaptor to build a type that is compliant to the concept of a weak associative container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER>=1200) +#pragma once +#endif + +#include + +#include + +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Base, class Iterator, class ConstIterator, + class ReverseIterator, class ConstReverseIterator, + class IteratorToBaseConverter, class IteratorFromBaseConverter, + class ReverseIteratorFromBaseConverter, + class ValueToBaseConverter, class ValueFromBaseConverter, + class FunctorsFromDerivedClasses +> +struct sequence_container_adaptor_base +{ + typedef container_adaptor + < + Base, Iterator, ConstIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + + BOOST_DEDUCED_TYPENAME mpl::push_front< + + FunctorsFromDerivedClasses, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::reverse_iterator, + ReverseIterator, + BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator, + ConstReverseIterator + >, + // } + // else + // { + ReverseIteratorFromBaseConverter + // } + + >::type + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Container adaptor to build a type that is compliant to the concept of a sequence container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class sequence_container_adaptor : + + public sequence_container_adaptor_base + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + >::type, + + ::boost::totally_ordered + < + sequence_container_adaptor + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + > + > +{ + typedef BOOST_DEDUCED_TYPENAME sequence_container_adaptor_base + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + >::type base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef ReverseIterator reverse_iterator; + typedef ConstReverseIterator const_reverse_iterator; + + protected: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::reverse_iterator, + reverse_iterator, + BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator, + const_reverse_iterator + >, + // } + // else + // { + ReverseIteratorFromBaseConverter + // } + + >::type reverse_iterator_from_base; + + + // Access ----------------------------------------------------------------- + + public: + + explicit sequence_container_adaptor(Base & c) + : base_(c) {} + + protected: + + + typedef sequence_container_adaptor sequence_container_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + reverse_iterator rbegin() + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rbegin() ); + + } + + reverse_iterator rend() + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rend() ); + } + + const_reverse_iterator rbegin() const + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rbegin() ); + } + + const_reverse_iterator rend() const + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rend() ); + } + + void resize(BOOST_DEDUCED_TYPENAME base_::size_type n, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x = + BOOST_DEDUCED_TYPENAME base_::value_type()) + { + this->base().resize(n, + this->template functor()(x) + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference front() + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().front() + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference back() + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().back() + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference front() const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().front() + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference back() const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().back() + ); + } + + void push_front( + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + this->base().push_front( + this->template functor()(x)); + } + + void pop_front() + { + this->base().pop_front(); + } + + void push_back( + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + this->base().push_back( + this->template functor()(x)); + } + + void pop_back() + { + this->base().pop_back(); + } + + std::pair + insert(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + std::pair< BOOST_DEDUCED_TYPENAME Base::iterator, bool > r( + this->base().insert( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x) + ) + ); + + return std::pair( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(r.first), + r.second + ); + } + + void insert(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::size_type m, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + this->base().insert( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + m, + this->template functor()(x) + ); + } + + template< class InputIterator > + void insert(BOOST_DEDUCED_TYPENAME base_::iterator position, + InputIterator first, InputIterator last) + { + // This is the same problem found in the insert function + // of container_adaptor + // For now, do the simple thing. This can be optimized + + for( ; first != last ; ++first ) + { + this->base().insert( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()( position ), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_to_base >()( *first ) + ); + } + } + + // Totally ordered implementation + + bool operator==(const sequence_container_adaptor & c) const + { + return ( this->base() == c.base() ); + } + + bool operator<(const sequence_container_adaptor & c) const + { + return ( this->base() < c.base() ); + } +}; + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP