/usr/include/boost/xpressive/detail/core
Edit: /usr/include/boost/xpressive/detail/core/results_cache.hpp (4480B)
///////////////////////////////////////////////////////////////////////////////
// results_cache.hpp
//
// Copyright 2008 Eric Niebler. 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)
#ifndef BOOST_XPRESSIVE_DETAIL_CORE_RESULTS_CACHE_HPP_EAN_10_04_2005
#define BOOST_XPRESSIVE_DETAIL_CORE_RESULTS_CACHE_HPP_EAN_10_04_2005
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
#include
#include
#include
#include
#include
#include
#include
namespace boost { namespace xpressive { namespace detail
{
///////////////////////////////////////////////////////////////////////////////
// nested_results
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
template
struct nested_results
: detail::list >
{
friend struct results_cache;
friend struct match_results;
};
#else
template
struct nested_results
: private detail::list >
{
friend struct results_cache;
friend struct xpressive::match_results;
typedef list > base_type;
typedef typename base_type::iterator iterator;
typedef typename base_type::const_iterator const_iterator;
typedef typename base_type::pointer pointer;
typedef typename base_type::const_pointer const_pointer;
typedef typename base_type::reference reference;
typedef typename base_type::const_reference const_reference;
typedef typename base_type::size_type size_type;
using base_type::begin;
using base_type::end;
using base_type::size;
using base_type::empty;
using base_type::front;
using base_type::back;
};
#endif
///////////////////////////////////////////////////////////////////////////////
// results_cache
//
// cache storage for reclaimed match_results structs
template
struct results_cache
{
typedef core_access access;
match_results &append_new(nested_results &out)
{
if(this->cache_.empty())
{
out.push_back(match_results());
}
else
{
BOOST_ASSERT(access::get_nested_results(this->cache_.back()).empty());
out.splice(out.end(), this->cache_, --this->cache_.end());
}
return out.back();
}
// move the last match_results struct into the cache
void reclaim_last(nested_results &out)
{
BOOST_ASSERT(!out.empty());
// first, reclaim any nested results
nested_results &nested = access::get_nested_results(out.back());
if(!nested.empty())
{
this->reclaim_all(nested);
}
// then, reclaim the last match_results
this->cache_.splice(this->cache_.end(), out, --out.end());
}
// move the last n match_results structs into the cache
void reclaim_last_n(nested_results &out, std::size_t count)
{
for(; 0 != count; --count)
{
this->reclaim_last(out);
}
}
void reclaim_all(nested_results &out)
{
typedef typename nested_results::iterator iter_type;
// first, recursively reclaim all the nested results
for(iter_type begin = out.begin(); begin != out.end(); ++begin)
{
nested_results &nested = access::get_nested_results(*begin);
if(!nested.empty())
{
this->reclaim_all(nested);
}
}
// next, reclaim the results themselves
this->cache_.splice(this->cache_.end(), out);
}
private:
nested_results cache_;
};
}}} // namespace boost::xpressive::detail
#endif