Skip to content
Snippets Groups Projects
ParseArray.cti 6.11 KiB
Newer Older
sbund's avatar
sbund committed
// $Id$
//
// Copyright (C) 2006
sbund's avatar
sbund committed
// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
//     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the
// Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

// Definition of inline template functions

#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_ senf::Parse_Array<elements,Parser,Iterator,IPacket>::Parse_Array()
sbund's avatar
sbund committed
{}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_
senf::Parse_Array<elements,Parser,Iterator,IPacket>::Parse_Array(Iterator const & i)
    : ParserBase<Iterator,IPacket>(i)
sbund's avatar
sbund committed
{}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ unsigned senf::Parse_Array<elements,Parser,Iterator,IPacket>::bytes()
sbund's avatar
sbund committed
{
    return elements*Parser::bytes();
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ bool
senf::Parse_Array<elements,Parser,Iterator,IPacket>::check(Iterator const & e)
sbund's avatar
sbund committed
    const
{
    return e-this->i() >= bytes();
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ void senf::Parse_Array<elements,Parser,Iterator,IPacket>::init()
sbund's avatar
sbund committed
    const
{
    iterator e=end();
    for (iterator i=begin(); i!=e; ++i) i->init();
}

///////////////////////////////////////////////////////////////////////////

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::size_type
senf::Parse_Array<elements,Parser,Iterator,IPacket>::size()
sbund's avatar
sbund committed
{
    return elements;
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
senf::Parse_Array<elements,Parser,Iterator,IPacket>::begin()
sbund's avatar
sbund committed
    const
{
    return iterator(this->i());
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
senf::Parse_Array<elements,Parser,Iterator,IPacket>::end()
sbund's avatar
sbund committed
    const
{
    return iterator(this->i()+bytes());
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::range_type
senf::Parse_Array<elements,Parser,Iterator,IPacket>::range()
sbund's avatar
sbund committed
    const
{
    return std::make_pair(begin(),end());
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
senf::Parse_Array<elements,Parser,Iterator,IPacket>::value()
sbund's avatar
sbund committed
    const
{
    return begin();
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::value_type
senf::Parse_Array<elements,Parser,Iterator,IPacket>::operator[](difference_type i)
sbund's avatar
sbund committed
    const
{
    return begin()[i];
}

template <unsigned elements, class Parser, class Iterator, class IPacket>
template <class InputIterator>
prefix_ senf::Parse_Array<elements,Parser,Iterator,IPacket> const &
senf::Parse_Array<elements,Parser,Iterator,IPacket>::operator=(InputIterator const & i)
sbund's avatar
sbund committed
{
    copy_n(i,size(),begin());
}

///////////////////////////////////////////////////////////////////////////

template <class Parser, class Iterator>
prefix_ Iterator senf::impl::Parse_Array_iterator<Parser,Iterator>::raw()
sbund's avatar
sbund committed
    const
{
    return i_;
}

template <class Parser, class Iterator>
prefix_ Parser senf::impl::Parse_Array_iterator<Parser,Iterator>::operator[](int i)
sbund's avatar
sbund committed
    const
{
    return (*this+i).dereference();
}

template <class Parser, class Iterator>
prefix_ senf::impl::Parse_Array_iterator<Parser,Iterator>::Parse_Array_iterator()
sbund's avatar
sbund committed
    : i_()
{}

template <class Parser, class Iterator>
prefix_  senf::impl::Parse_Array_iterator<Parser,Iterator>::
sbund's avatar
sbund committed
Parse_Array_iterator(Iterator const & i)
    : i_(i)
{}

template <class Parser, class Iterator>
prefix_ Parser
senf::impl::Parse_Array_iterator<Parser,Iterator>::dereference()
sbund's avatar
sbund committed
    const
{
    return Parser(i_);
}

template <class Parser, class Iterator>
prefix_ bool senf::impl::Parse_Array_iterator<Parser,Iterator>::
sbund's avatar
sbund committed
equal(Parse_Array_iterator const & other)
    const
{
    return i_==other.i_;
}

template <class Parser, class Iterator>
prefix_ int senf::impl::Parse_Array_iterator<Parser,Iterator>::
sbund's avatar
sbund committed
distance_to(Parse_Array_iterator const & other)
    const
{
    return (other.i_-i_)/Parser::bytes();
}

template <class Parser, class Iterator>
prefix_ void senf::impl::Parse_Array_iterator<Parser,Iterator>::increment()
sbund's avatar
sbund committed
{
    i_ += Parser::bytes();
}

template <class Parser, class Iterator>
prefix_ void senf::impl::Parse_Array_iterator<Parser,Iterator>::decrement()
sbund's avatar
sbund committed
{
    i_ -= Parser::bytes();
}

template <class Parser, class Iterator>
prefix_ void
senf::impl::Parse_Array_iterator<Parser,Iterator>::advance(int n)
sbund's avatar
sbund committed
{
    i_ += n*Parser::bytes();
}

#undef copy_n
///////////////////////////////cti.e///////////////////////////////////////
#undef prefix_


// Local Variables:
// mode: c++
// fill-column: 100
// c-file-style: "senf"
// indent-tabs-mode: nil
// ispell-local-dictionary: "american"
// compile-command: "scons -u test"
// comment-column: 40
sbund's avatar
sbund committed
// End: