00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TAG_BUFFER_H
00021 #define TAG_BUFFER_H
00022
00023 #include <stdint.h>
00024
00025 #define TAG_BUFFER_USE_INLINE 1
00026
00027 #ifdef TAG_BUFFER_USE_INLINE
00028 #define TAG_BUFFER_INLINE inline
00029 #else
00030 #define TAG_BUFFER_INLINE
00031 #endif
00032
00033 namespace ns3 {
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 class TagBuffer
00052 {
00053 public:
00054 TagBuffer (uint8_t *start, uint8_t *end);
00055 void TrimAtEnd (uint32_t trim);
00056 void CopyFrom (TagBuffer o);
00057
00058
00059
00060
00061
00062
00063 TAG_BUFFER_INLINE void WriteU8 (uint8_t v);
00064
00065
00066
00067
00068
00069 TAG_BUFFER_INLINE void WriteU16 (uint16_t v);
00070
00071
00072
00073
00074
00075 TAG_BUFFER_INLINE void WriteU32 (uint32_t v);
00076
00077
00078
00079
00080
00081 void WriteU64 (uint64_t v);
00082
00083
00084
00085
00086
00087
00088 void WriteDouble (double v);
00089
00090
00091
00092
00093
00094
00095
00096 void Write (const uint8_t *buffer, uint32_t size);
00097
00098
00099
00100
00101
00102
00103 TAG_BUFFER_INLINE uint8_t ReadU8 (void);
00104
00105
00106
00107
00108
00109
00110 TAG_BUFFER_INLINE uint16_t ReadU16 (void);
00111
00112
00113
00114
00115
00116
00117 TAG_BUFFER_INLINE uint32_t ReadU32 (void);
00118
00119
00120
00121
00122
00123
00124 uint64_t ReadU64 (void);
00125
00126
00127
00128
00129
00130
00131 double ReadDouble (void);
00132
00133
00134
00135
00136
00137
00138
00139
00140 void Read (uint8_t *buffer, uint32_t size);
00141 private:
00142
00143 uint8_t *m_current;
00144 uint8_t *m_end;
00145 };
00146
00147 }
00148
00149 #ifdef TAG_BUFFER_USE_INLINE
00150
00151 #include "ns3/assert.h"
00152
00153 namespace ns3 {
00154
00155 void
00156 TagBuffer::WriteU8 (uint8_t v)
00157 {
00158 NS_ASSERT (m_current + 1 <= m_end);
00159 *m_current = v;
00160 m_current++;
00161 }
00162
00163 void
00164 TagBuffer::WriteU16 (uint16_t data)
00165 {
00166 WriteU8 ((data >> 0) & 0xff);
00167 WriteU8 ((data >> 8) & 0xff);
00168 }
00169 void
00170 TagBuffer::WriteU32 (uint32_t data)
00171 {
00172 WriteU8 ((data >> 0) & 0xff);
00173 WriteU8 ((data >> 8) & 0xff);
00174 WriteU8 ((data >> 16) & 0xff);
00175 WriteU8 ((data >> 24) & 0xff);
00176 }
00177
00178 uint8_t
00179 TagBuffer::ReadU8 (void)
00180 {
00181 NS_ASSERT (m_current + 1 <= m_end);
00182 uint8_t v;
00183 v = *m_current;
00184 m_current++;
00185 return v;
00186 }
00187
00188 uint16_t
00189 TagBuffer::ReadU16 (void)
00190 {
00191 uint8_t byte0 = ReadU8 ();
00192 uint8_t byte1 = ReadU8 ();
00193 uint16_t data = byte1;
00194 data <<= 8;
00195 data |= byte0;
00196 return data;
00197 }
00198 uint32_t
00199 TagBuffer::ReadU32 (void)
00200 {
00201 uint8_t byte0 = ReadU8 ();
00202 uint8_t byte1 = ReadU8 ();
00203 uint8_t byte2 = ReadU8 ();
00204 uint8_t byte3 = ReadU8 ();
00205 uint32_t data = byte3;
00206 data <<= 8;
00207 data |= byte2;
00208 data <<= 8;
00209 data |= byte1;
00210 data <<= 8;
00211 data |= byte0;
00212 return data;
00213 }
00214
00215 }
00216
00217 #endif
00218
00219 #endif