// $Id$ // // Copyright (C) 2006 // Fraunhofer Institute for Open Communication Systems (FOKUS) // // The contents of this file are subject to the Fraunhofer FOKUS Public License // Version 1.0 (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // http://senf.berlios.de/license.html // // The Fraunhofer FOKUS Public License Version 1.0 is based on, // but modifies the Mozilla Public License Version 1.1. // See the full license text for the amendments. // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License // for the specific language governing rights and limitations under the License. // // The Original Code is Fraunhofer FOKUS code. // // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. // (registered association), Hansastraße 27 c, 80686 Munich, Germany. // All Rights Reserved. // // Contributor(s): // Stefan Bund /** \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_ senf::PacketInterpreterBase::size_type senf::VectorParser::bytes() const { return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes; } // Container interface template prefix_ senf::PacketInterpreterBase::size_type senf::VectorParser::size() const { return AuxPolicy::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(AuxPolicy::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 AuxPolicy::WrapperPolicy::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( AuxPolicy::WrapperPolicy::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) { AuxPolicy::WrapperPolicy::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: