// $Id$
//
-// Copyright (C) 2006
+// Copyright (C) 2006
// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
// Stefan Bund <stefan.bund@fokus.fraunhofer.de>
// Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-// Definition of inline template functions
+/** \file
+ \brief ParseArray inline template implementation */
#include "ParseArray.ih"
// Custom includes
-#include <algorithm>
-#if defined(_STLP_ALGORITHM) || (__GNUC__<4 && __GNUC_MINOR__<4)
-#define copy_n std::copy_n
-#else
-#include <ext/algorithm>
-#define copy_n __gnu_cxx::copy_n
-#endif
#define prefix_ inline
///////////////////////////////cti.p///////////////////////////////////////
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::Parse_Array()
-{}
+///////////////////////////////////////////////////////////////////////////
+// senf::Parse_Array<elements,ElementParser>
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::Parse_Array(Iterator const & i)
- : ParserBase<Iterator,IPacket>(i)
+template <unsigned elements, class ElementParser>
+prefix_ senf::Parse_Array<elements,ElementParser>::Parse_Array(data_iterator i, state_type s)
+ : PacketParserBase(i,s,fixed_bytes)
{}
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ unsigned satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::bytes()
-{
- return elements*Parser::bytes();
-}
-
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ bool
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::check(Iterator const & e)
- const
-{
- return e-this->i() >= bytes();
-}
-
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ void satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::init()
- const
-{
- iterator e=end();
- for (iterator i=begin(); i!=e; ++i) i->init();
-}
-
-///////////////////////////////////////////////////////////////////////////
+// Container interface
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ typename satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::size_type
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::size()
+template <unsigned elements, class ElementParser>
+prefix_ typename senf::Parse_Array<elements,ElementParser>::size_type
+senf::Parse_Array<elements,ElementParser>::size()
{
return elements;
}
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ typename satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::begin()
- const
-{
- return iterator(this->i());
-}
-
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ typename satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::end()
- const
-{
- return iterator(this->i()+bytes());
-}
-
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ typename satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::range_type
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::range()
+template <unsigned elements, class ElementParser>
+prefix_ typename senf::Parse_Array<elements,ElementParser>::iterator
+senf::Parse_Array<elements,ElementParser>::begin()
const
{
- return std::make_pair(begin(),end());
+ return iterator(i(),state());
}
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ typename satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::value()
+template <unsigned elements, class ElementParser>
+prefix_ typename senf::Parse_Array<elements,ElementParser>::iterator
+senf::Parse_Array<elements,ElementParser>::end()
const
{
- return begin();
+ return iterator(boost::next(i(),fixed_bytes),state());
}
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-prefix_ typename satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::value_type
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::operator[](difference_type i)
+template <unsigned elements, class ElementParser>
+prefix_ typename senf::Parse_Array<elements,ElementParser>::value_type
+senf::Parse_Array<elements,ElementParser>::operator[](difference_type i)
const
{
+ BOOST_ASSERT( i>=0 && i < difference_type(elements) );
return begin()[i];
}
-template <unsigned elements, class Parser, class Iterator, class IPacket>
-template <class InputIterator>
-prefix_ satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket> const &
-satcom::pkf::Parse_Array<elements,Parser,Iterator,IPacket>::operator=(InputIterator const & i)
-{
- copy_n(i,size(),begin());
-}
-
///////////////////////////////////////////////////////////////////////////
+// senf::detail::Parse_Array_iterator<ElementParser>
+
+template <class ElementParser>
+prefix_ senf::detail::Parse_Array_iterator<ElementParser>::Parse_Array_iterator()
+ : i_()
+{}
+
+template <class ElementParser>
+prefix_ senf::detail::Parse_Array_iterator<ElementParser>::
+Parse_Array_iterator(PacketParserBase::data_iterator const & i, PacketParserBase::state_type s)
+ : i_(i), s_(s)
+{}
-template <class Parser, class Iterator>
-prefix_ Iterator satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::raw()
+template <class ElementParser>
+prefix_ ElementParser
+senf::detail::Parse_Array_iterator<ElementParser>::operator[](int i)
const
{
- return i_;
+ return (*this+i).dereference();
}
-template <class Parser, class Iterator>
-prefix_ Parser satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::operator[](int i)
+template <class ElementParser>
+prefix_ senf::PacketParserBase::data_iterator
+senf::detail::Parse_Array_iterator<ElementParser>::raw()
const
{
- return (*this+i).dereference();
+ return i_;
}
-template <class Parser, class Iterator>
-prefix_ satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::Parse_Array_iterator()
- : i_()
-{}
+// iterator_facade interface
-template <class Parser, class Iterator>
-prefix_ satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::
-Parse_Array_iterator(Iterator const & i)
- : i_(i)
-{}
-
-template <class Parser, class Iterator>
-prefix_ Parser
-satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::dereference()
+template <class ElementParser>
+prefix_ ElementParser
+senf::detail::Parse_Array_iterator<ElementParser>::dereference()
const
{
- return Parser(i_);
+ return ElementParser(i_,s_);
}
-template <class Parser, class Iterator>
-prefix_ bool satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::
+template <class ElementParser>
+prefix_ bool
+senf::detail::Parse_Array_iterator<ElementParser>::
equal(Parse_Array_iterator const & other)
const
{
return i_==other.i_;
}
-template <class Parser, class Iterator>
-prefix_ int satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::
+template <class ElementParser>
+prefix_ int senf::detail::Parse_Array_iterator<ElementParser>::
distance_to(Parse_Array_iterator const & other)
const
{
- return (other.i_-i_)/Parser::bytes();
+ return (other.i_-i_)/ElementParser::fixed_bytes;
}
-template <class Parser, class Iterator>
-prefix_ void satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::increment()
+template <class ElementParser>
+prefix_ void senf::detail::Parse_Array_iterator<ElementParser>::increment()
{
- i_ += Parser::bytes();
+ i_ += ElementParser::fixed_bytes;
}
-template <class Parser, class Iterator>
-prefix_ void satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::decrement()
+template <class ElementParser>
+prefix_ void senf::detail::Parse_Array_iterator<ElementParser>::decrement()
{
- i_ -= Parser::bytes();
+ i_ -= ElementParser::fixed_bytes;
}
-template <class Parser, class Iterator>
-prefix_ void
-satcom::pkf::impl::Parse_Array_iterator<Parser,Iterator>::advance(int n)
+template <class ElementParser>
+prefix_ void senf::detail::Parse_Array_iterator<ElementParser>::advance(int n)
{
- i_ += n*Parser::bytes();
+ i_ += n*ElementParser::fixed_bytes;
}
-#undef copy_n
///////////////////////////////cti.e///////////////////////////////////////
#undef prefix_
\f
// Local Variables:
// mode: c++
-// c-file-style: "satcom"
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
// End: