// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
#include "ListParser.ih"
// Custom includes
+#include "../Utils/senfassert.hh"
#define prefix_ inline
///////////////////////////////cti.p///////////////////////////////////////
prefix_ bool senf::ListParser<ListPolicy>::empty()
const
{
- return begin() == end();
-}
-
-template <class ListPolicy>
-prefix_ typename senf::ListParser<ListPolicy>::iterator
-senf::ListParser<ListPolicy>::begin()
- const
-{
- return iterator(i(),state(),iterator::Begin);
-}
-
-template <class ListPolicy>
-prefix_ typename senf::ListParser<ListPolicy>::iterator
-senf::ListParser<ListPolicy>::end()
- const
-{
- return iterator(i(),state(),iterator::End);
+ container c (*this);
+ return c.empty();
}
template <class ListPolicy>
senf::ListParser<ListPolicy>::front()
const
{
- BOOST_ASSERT( ! empty() );
- return *begin();
+ SENF_ASSERT( ! empty() );
+ container c(*this);
+ return *(c.begin());
}
template <class ListPolicy>
c.resize(n,value);
}
+template <class ListPolicy>
+prefix_ typename senf::ListParser<ListPolicy> &
+senf::ListParser<ListPolicy>::get(ListPolicy & p)
+{
+ return static_cast<ListParser &>(p);
+}
+
+template <class ListPolicy>
+prefix_ typename senf::ListParser<ListPolicy> const &
+senf::ListParser<ListPolicy>::get(ListPolicy const & p)
+{
+ return static_cast<ListParser const &>(p);
+}
+
///////////////////////////////////////////////////////////////////////////
// senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
-template <class ElementParser, class IteratorPolicy>
-prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::ListParser_Iterator()
-{}
-
-template <class ElementParser, class IteratorPolicy>
-prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
-ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, Begin_t)
- : IteratorPolicy(), i_(IteratorPolicy::setBegin(i,s)), s_(s)
+template <class Container>
+prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator()
{}
-template <class ElementParser, class IteratorPolicy>
-prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
-ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, End_t)
- : IteratorPolicy(), i_(IteratorPolicy::setEnd(i,s)), s_(s)
+template <class Container>
+prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator(Container const & c)
+ : c_ (&c)
{}
-template <class ElementParser, class IteratorPolicy>
-prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
-ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s,
- PacketParserBase::data_iterator p)
- : IteratorPolicy(), i_(p), s_(s)
+template <class Container>
+prefix_ senf::PacketParserBase::data_iterator
+senf::detail::ListParser_Iterator<Container>::raw()
+ const
{
- IteratorPolicy::setFromPosition(i,s,p);
+ return c_->Container::policy::raw(*c_, *this);
}
-template <class ElementParser, class IteratorPolicy>
+template <class Container>
prefix_ senf::PacketParserBase::data_iterator
-senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::raw()
+senf::detail::ListParser_Iterator<Container>::i()
const
{
- return IteratorPolicy::raw(i_,s_);
+ return i_;
+}
+
+template <class Container>
+prefix_ typename senf::detail::ListParser_Iterator<Container> &
+senf::detail::ListParser_Iterator<Container>::get(typename Container::policy::iterator_data & d)
+{
+ return static_cast<ListParser_Iterator &>(d);
+}
+
+template <class Container>
+prefix_ typename senf::detail::ListParser_Iterator<Container> const &
+senf::detail::ListParser_Iterator<Container>::
+get(typename Container::policy::iterator_data const & d)
+{
+ return static_cast<ListParser_Iterator const &>(d);
}
-template <class ElementParser, class IteratorPolicy>
-prefix_ ElementParser
-senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::dereference()
+template <class Container>
+prefix_ typename senf::detail::ListParser_Iterator<Container>::value_type
+senf::detail::ListParser_Iterator<Container>::dereference()
const
{
- return ElementParser(i_,s_);
+ return value_type(i_,c_->state());
}
-template <class ElementParser, class IteratorPolicy>
-prefix_ bool senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
-equal(ListParser_Iterator const & other)
+template <class Container>
+prefix_ bool
+senf::detail::ListParser_Iterator<Container>::equal(ListParser_Iterator const & other)
const
{
return i_ == other.i_;
}
-template <class ElementParser, class IteratorPolicy>
-prefix_ void senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::increment()
+template <class Container>
+prefix_ void senf::detail::ListParser_Iterator<Container>::increment()
{
- i_ = IteratorPolicy::next(i_,s_);
+ i_ = c_->Container::policy::next(*c_, *this);
}
///////////////////////////////////////////////////////////////////////////
template <class ListPolicy>
prefix_ senf::ListParser_Container<ListPolicy>::
ListParser_Container(parser_type const & list)
- : ListPolicy(list), state_(list.state()), i_(std::distance(data().begin(),list.i()))
+ : ListPolicy(static_cast<typename parser_type::policy const &>(list)),
+ state_(list.state()), i_(std::distance(data().begin(),list.i()))
{}
template <class ListPolicy>
prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
{
- ListPolicy::update(i(),state());
+ ListPolicy::update(*this);
}
// Accessors
senf::ListParser_Container<ListPolicy>::size()
const
{
- ListPolicy::update(i(),state());
+ ListPolicy::update(*this);
return ListPolicy::size(i(),state());
}
prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
const
{
- ListPolicy::update(i(),state());
+ ListPolicy::update(*this);
return begin() == end();
}
senf::ListParser_Container<ListPolicy>::begin()
const
{
- ListPolicy::update(i(),state());
- return iterator(i(),state(),iterator::Begin);
+ ListPolicy::update(*this);
+ iterator i (*this);
+ i.i_ = ListPolicy::setBegin(*this, i);
+ return i;
}
template <class ListPolicy>
senf::ListParser_Container<ListPolicy>::end()
const
{
- ListPolicy::update(i(),state());
- return iterator(i(),state(),iterator::End);
+ ListPolicy::update(*this);
+ iterator i (*this);
+ i.i_ = ListPolicy::setEnd(*this, i);
+ return i;
}
template <class ListPolicy>
senf::ListParser_Container<ListPolicy>::front()
const
{
- BOOST_ASSERT( ! empty() );
+ SENF_ASSERT( ! empty() );
return *begin();
}
senf::ListParser_Container<ListPolicy>::parser()
const
{
- ListPolicy::update(i(),state());
+ ListPolicy::update(*this);
return parser_type(i(),state());
}
senf::ListParser_Container<ListPolicy>::bytes()
const
{
- ListPolicy::update(i(),state());
+ ListPolicy::update(*this);
return ListPolicy::bytes(i(),state());
}