// $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 non-inline template funPacketRegistry.ons
+/** \file
+ \brief ParseVec non-inline template implementation */
-//#include "ParseVec.ih"
+#include "ParseVec.ih"
// Custom includes
#define prefix_
///////////////////////////////ct.p////////////////////////////////////////
-template <class Parser, class SizeParser, class Container>
-template <class Value>
-prefix_ void
-senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::insert(iterator pos,
- Value const & t)
+///////////////////////////////////////////////////////////////////////////
+// senf::Parse_Vector<ElementParser,Sizer>
+
+template <class ElementParser, class Sizer>
+prefix_ void senf::Parse_Vector<ElementParser,Sizer>::init()
+ const
+{
+ sizer_.init(i(),state());
+ iterator i (begin());
+ iterator const e (end());
+ for (; i!=e; ++i)
+ i->init();
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::Parse_Vector_Container<ElementParser,Sizer>
+
+template <class ElementParser, class Sizer>
+prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::init()
+ const
+{
+ iterator i (begin());
+ iterator const e (end());
+ for (; i!=e; ++i)
+ i->init();
+}
+
+// Mutators
+
+template <class ElementParser, class Sizer>
+prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::iterator
+senf::Parse_Vector_Container<ElementParser,Sizer>::shift(iterator pos, size_type n)
{
- size_type ix(pos.raw()-container_.begin());
- shift(pos);
- Parser(container_.begin()+ix).value(t);
+ size_type ix (std::distance(data().begin(),pos.raw()));
+ data().insert(pos.raw(),n*ElementParser::fixed_bytes,0);
+ setSize(size()+n);
+ return iterator(boost::next(data().begin(),ix),state());
}
-template <class Parser, class SizeParser, class Container>
+template <class ElementParser, class Sizer>
template <class Value>
-prefix_ void
-senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::insert(iterator pos,
+prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::insert(iterator pos,
size_type n,
Value const & t)
{
- size_type ix(pos.raw()-container_.begin());
- shift(pos,n);
- typename Container::iterator j (container_.begin()+ix);
- for (; n; --n, j+=Parser::bytes())
- Parser(j).value(t);
+ for (iterator j (shift(pos,n)); n; --n, ++j)
+ *j << t;
+}
+
+#ifndef DOXYGEN
+template <class ElementParser, class Sizer>
+template <class ForwardIterator>
+prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::
+insert(iterator pos, ForwardIterator f, ForwardIterator l,
+ typename boost::disable_if< boost::is_convertible<ForwardIterator,size_type> >::type *)
+{
+ for (iterator j (shift(pos,std::distance(f,l))); f!=l; ++f,++j)
+ *j << *f;
}
+#else
+template <class ElementParser, class Sizer>
+template <class ForwardIterator>
+prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::
+insert(iterator pos, ForwardIterator f, ForwardIterator l)
+{}
+#endif
-template <class Parser, class SizeParser, class Container>
-template <class InputIterator>
-prefix_ void
-senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::insert(iterator pos,
- InputIterator f,
- InputIterator l)
+template <class ElementParser, class Sizer>
+prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::resize(size_type n)
+{
+ if (size()>=n)
+ erase(boost::next(begin(),n),end());
+ else
+ push_back_space(n-size());
+}
+
+template <class ElementParser, class Sizer>
+template <class Value>
+prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::resize(size_type n, Value value)
{
- /** \fixme This might be horribly inefficient ... we need to
- specialize for random_access and forward iterators, where we
- can count the distance */
-
- size_type ix(pos.raw()-container_.begin());
- for (;f!=l;++f) {
- insert(container_.begin()+ix,*f);
- ix += Parser::bytes();
- }
+ if (size()>=n)
+ erase(boost::next(begin(),n),end());
+ else
+ push_back(value,n-size());
}
///////////////////////////////ct.e////////////////////////////////////////
\f
// 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
// End: