// $Id$ // // Copyright (C) 2006 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // 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. /** \file \brief VectorParser inline template implementation */ #include "VectorParser.ih" // Custom includes #define prefix_ inline //-///////////////////////////////////////////////////////////////////////////////////////////////// //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::VectorParser template prefix_ senf::VectorParser::VectorParser(data_iterator i, state_type s) : PacketParserBase(i,s), AuxPolicy() {} template prefix_ senf::VectorParser::VectorParser(AuxPolicy policy, data_iterator i, state_type s) : PacketParserBase(i,s), AuxPolicy(policy) {} template prefix_ typename senf::VectorParser::size_type senf::VectorParser::bytes() const { return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes; } // Container interface template prefix_ typename senf::VectorParser::size_type senf::VectorParser::size() const { return aux(i(),state()); } template prefix_ bool senf::VectorParser::empty() const { return size()==0; } template prefix_ typename senf::VectorParser::iterator senf::VectorParser::begin() const { return iterator(adjust(i(),state()),state()); } template prefix_ typename senf::VectorParser::iterator senf::VectorParser::end() const { return boost::next(begin(),size()); } template prefix_ typename senf::VectorParser::value_type senf::VectorParser::operator[](difference_type i) const { return begin()[i]; } template prefix_ typename senf::VectorParser::value_type senf::VectorParser::front() const { return begin()[0]; } template prefix_ typename senf::VectorParser::value_type senf::VectorParser::back() const { return begin()[size()-1]; } // Mutators template template prefix_ void senf::VectorParser::push_back(Value const & value, size_type n) const { container c (*this); c.push_back(value,n); } template prefix_ typename senf::VectorParser::value_type senf::VectorParser::push_back_space(size_type n) const { container c (*this); return c.push_back_space(n); } template template prefix_ void senf::VectorParser::push_front(Value const & value, size_type n) const { container c (*this); c.push_front(value,n); } template prefix_ typename senf::VectorParser::value_type senf::VectorParser::push_front_space(size_type n) const { container c (*this); return c.push_front_space(n); } template prefix_ void senf::VectorParser::resize(size_type n) const { container c (*this); c.resize(n); } template template prefix_ void senf::VectorParser::resize(size_type n, Value value) const { container c (*this); c.resize(n,value); } //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::VectorParser_wrapper // structors and default members // hm ... be careful here ! the data() member is called in an incompletely intitialized // instance. However, data() only depends on state_ which is initialized before the call. YOU MUST // NOT CHANGE THE ORDERING OF THE DATA MEMBERS template prefix_ senf::VectorParser_Container:: VectorParser_Container(parser_type const & vector) : AuxPolicy::WrapperPolicy(static_cast(vector)), state_ (vector.state()), i_ (std::distance(data().begin(),vector.i())) {} // accessors template prefix_ typename senf::VectorParser_Container::size_type senf::VectorParser_Container::size() const { return aux(i(),state()); } template prefix_ bool senf::VectorParser_Container::empty() const { return size() == 0; } template prefix_ typename senf::VectorParser_Container::iterator senf::VectorParser_Container::begin() const { return iterator(adjust(i(),state()),state()); } template prefix_ typename senf::VectorParser_Container::iterator senf::VectorParser_Container::end() const { return boost::next(begin(),size()); } template prefix_ typename senf::VectorParser_Container::value_type senf::VectorParser_Container::operator[](difference_type i) const { return begin()[i]; } template prefix_ typename senf::VectorParser_Container::value_type senf::VectorParser_Container::front() const { return begin()[0]; } template prefix_ typename senf::VectorParser_Container::value_type senf::VectorParser_Container::back() const { return begin()[size()-1]; } // Mutators template template prefix_ void senf::VectorParser_Container::insert(iterator pos, Value const & t) { *shift(pos) << t; } template prefix_ void senf::VectorParser_Container::erase(iterator pos, size_type n) { setSize(size()-n); data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes)); } template prefix_ void senf::VectorParser_Container::erase(iterator f, iterator l) { erase(f,std::distance(f,l)); } template prefix_ void senf::VectorParser_Container::clear() { erase(begin(),end()); } template template prefix_ void senf::VectorParser_Container::push_back(Value const & value, size_type n) { insert(end(),n,value); } template prefix_ typename senf::VectorParser_Container::value_type senf::VectorParser_Container::push_back_space(size_type n) { return *shift(end(),n); } template template prefix_ void senf::VectorParser_Container::push_front(Value const & value, size_type n) { insert(begin(),n,value); } template prefix_ typename senf::VectorParser_Container::value_type senf::VectorParser_Container::push_front_space(size_type n) { return *shift(begin(),n); } // Parser interface template prefix_ typename senf::VectorParser_Container::parser_type senf::VectorParser_Container::parser() const { return parser_type(i(),state()); } template prefix_ typename senf::VectorParser_Container::data_iterator senf::VectorParser_Container::i() const { return boost::next(data().begin(),i_); } template prefix_ typename senf::VectorParser_Container::state_type senf::VectorParser_Container::state() const { return state_; } template prefix_ senf::PacketData & senf::VectorParser_Container::data() const { return *state_; } template prefix_ typename senf::VectorParser_Container::size_type senf::VectorParser_Container::bytes() const { return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes; } // private members template prefix_ void senf::VectorParser_Container::setSize(size_type value) { aux(value, i(),state()); } //-///////////////////////////////////////////////////////////////////////////////////////////////// #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 // End: