00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
00027
00028
00029
00030 #define prefix_ inline
00031
00032
00033
00034
00035
00036 prefix_ senf::safe_data_iterator::safe_data_iterator()
00037 : data_(0), i_(0)
00038 {}
00039
00040 prefix_ senf::safe_data_iterator::safe_data_iterator(PacketData & data)
00041 : data_(&data), i_(0)
00042 {}
00043
00044 prefix_ senf::safe_data_iterator::safe_data_iterator(PacketData & data, PacketData::iterator i)
00045 : data_(&data), i_(std::distance(data.begin(),i))
00046 {}
00047
00048 prefix_ senf::safe_data_iterator::safe_data_iterator(PacketParserBase const & parser)
00049 : data_(&parser.data()), i_(std::distance(data_->begin(),parser.i()))
00050 {}
00051
00052 prefix_ senf::PacketData::iterator senf::safe_data_iterator::i()
00053 const
00054 {
00055 SENF_ASSERT(data_, "Use/dereferencing of empty safe_data_iterator");
00056 return boost::next(data_->begin(),i_);
00057 }
00058
00059 prefix_ senf::safe_data_iterator & senf::safe_data_iterator::operator=(PacketData::iterator i)
00060 {
00061 SENF_ASSERT(data_, "Use/dereferencing of empty safe_data_iterator");
00062 i_ = std::distance(data_->begin(),i);
00063 return *this;
00064 }
00065
00066 prefix_ senf::safe_data_iterator &
00067 senf::safe_data_iterator::operator=(PacketParserBase const & parser)
00068 {
00069 data_ = &parser.data();
00070 i_ = std::distance(data_->begin(),parser.i());
00071 return *this;
00072 }
00073
00074 prefix_ senf::safe_data_iterator::operator senf::PacketData::iterator()
00075 const
00076 {
00077 return i();
00078 }
00079
00080 prefix_ bool senf::safe_data_iterator::boolean_test()
00081 const
00082 {
00083 return data_;
00084 }
00085
00086 prefix_ senf::PacketData & senf::safe_data_iterator::data()
00087 const
00088 {
00089 SENF_ASSERT(data_, "Use/dereferencing of empty safe_data_iterator");
00090 return *data_;
00091 }
00092
00093 prefix_ senf::safe_data_iterator::value_type & senf::safe_data_iterator::dereference()
00094 const
00095 {
00096 return *i();
00097 }
00098
00099 prefix_ bool senf::safe_data_iterator::equal(safe_data_iterator const & other)
00100 const
00101 {
00102 SENF_ASSERT(data_ == other.data_, "Comparing iterators of two different containers is invalid");
00103 return i_ == other.i_;
00104 }
00105
00106 prefix_ senf::safe_data_iterator::difference_type
00107 senf::safe_data_iterator::distance_to(safe_data_iterator const & other)
00108 const
00109 {
00110 SENF_ASSERT(data_ == other.data_, "Comparing iterators of two different containers is invalid");
00111 return other.i_ - i_;
00112 }
00113
00114 prefix_ void senf::safe_data_iterator::increment()
00115 {
00116 ++i_;
00117 }
00118
00119 prefix_ void senf::safe_data_iterator::decrement()
00120 {
00121 SENF_ASSERT(i_>0, "Decrementing iterator before beginning of container" );
00122 --i_;
00123 }
00124
00125 prefix_ void senf::safe_data_iterator::advance(difference_type n)
00126 {
00127 SENF_ASSERT( -n < difference_type(i_), "Moving iterator to before beginning of container" );
00128 i_ += n;
00129 }
00130
00131
00132 #undef prefix_
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143