blob: ab058860823e819ab122d9d5c4a1ade873948b5f [file] [log] [blame]
/*=============================================================================
Copyright (c) 2001-2007 Joel de Guzman
Copyright (c) 2001-2009 Hartmut Kaiser
http://spirit.sourceforge.net/
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)
=============================================================================*/
#if !defined(BOOST_SPIRIT_CONTAINER_FEB_06_2007_1001AM)
#define BOOST_SPIRIT_CONTAINER_FEB_06_2007_1001AM
#include <boost/spirit/home/support/unused.hpp>
#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
namespace boost { namespace spirit { namespace container
{
///////////////////////////////////////////////////////////////////////////
// This file contains some container utils for stl containers. The
// utilities provided also accept spirit's unused_type; all no-ops.
// Compiler optimization will easily strip these away.
///////////////////////////////////////////////////////////////////////////
namespace result_of
{
template <typename Container>
struct value
{
typedef typename Container::value_type type;
};
template <>
struct value<unused_type>
{
typedef unused_type type;
};
template <>
struct value<unused_type const>
{
typedef unused_type type;
};
template <typename Container>
struct iterator
{
typedef typename Container::iterator type;
};
template <typename Container>
struct iterator<Container const>
{
typedef typename Container::const_iterator type;
};
template <>
struct iterator<unused_type>
{
typedef unused_type const* type;
};
template <>
struct iterator<unused_type const>
{
typedef unused_type const* type;
};
}
///////////////////////////////////////////////////////////////////////////
template <typename Container, typename T>
inline void push_back(Container& c, T const& val)
{
c.push_back(val);
}
template <typename Container>
inline void push_back(Container&, unused_type)
{
}
template <typename T>
inline void push_back(unused_type, T const&)
{
}
inline void push_back(unused_type, unused_type)
{
}
///////////////////////////////////////////////////////////////////////////
template <typename Container>
inline typename result_of::iterator<Container>::type
begin(Container& c)
{
return c.begin();
}
template <typename Container>
inline typename result_of::iterator<Container const>::type
begin(Container const& c)
{
return c.begin();
}
inline unused_type const*
begin(unused_type)
{
return &unused;
}
template <typename Container>
inline typename result_of::iterator<Container>::type
end(Container& c)
{
return c.end();
}
template <typename Container>
inline typename result_of::iterator<Container const>::type
end(Container const& c)
{
return c.end();
}
inline unused_type const*
end(unused_type)
{
return &unused;
}
///////////////////////////////////////////////////////////////////////////
template <typename Iterator>
inline typename boost::detail::iterator_traits<Iterator>::value_type
deref(Iterator& it)
{
return *it;
}
inline unused_type
deref(unused_type*)
{
return unused;
}
inline unused_type
deref(unused_type const*)
{
return unused;
}
///////////////////////////////////////////////////////////////////////////
template <typename Iterator>
inline Iterator
next(Iterator& it)
{
return ++it;
}
inline unused_type
next(unused_type*)
{
return &unused;
}
inline unused_type
next(unused_type const*)
{
return &unused;
}
///////////////////////////////////////////////////////////////////////////
template <typename Iterator>
inline bool
compare(Iterator const& it1, Iterator const& it2)
{
return it1 == it2;
}
inline bool
compare(unused_type*, unused_type*)
{
return true;
}
}}}
#endif