A Discrete-Event Network Simulator
API
tag-buffer.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2008 INRIA
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19 */
20#include "tag-buffer.h"
21#include "ns3/assert.h"
22#include "ns3/log.h"
23#include <cstring>
24
25namespace ns3 {
26
27NS_LOG_COMPONENT_DEFINE ("TagBuffer");
28
29#ifndef TAG_BUFFER_USE_INLINE
30
31void
32TagBuffer::WriteU8 (uint8_t v)
33{
34 NS_LOG_FUNCTION (this << static_cast<uint32_t> (v));
35 NS_ASSERT (m_current + 1 <= m_end);
36 *m_current = v;
37 m_current++;
38}
39
40void
42{
43 NS_LOG_FUNCTION (this << data);
44 WriteU8 ((data >> 0) & 0xff);
45 WriteU8 ((data >> 8) & 0xff);
46}
47void
49{
50 NS_LOG_FUNCTION (this << data);
51 WriteU8 ((data >> 0) & 0xff);
52 WriteU8 ((data >> 8) & 0xff);
53 WriteU8 ((data >> 16) & 0xff);
54 WriteU8 ((data >> 24) & 0xff);
55}
56
57
58uint8_t
60{
61 NS_LOG_FUNCTION (this);
62 NS_ASSERT (m_current + 1 <= m_end);
63 uint8_t v;
64 v = *m_current;
65 m_current++;
66 return v;
67}
68
69uint16_t
71{
72 NS_LOG_FUNCTION (this);
73 uint8_t byte0 = ReadU8 ();
74 uint8_t byte1 = ReadU8 ();
75 uint16_t data = byte1;
76 data <<= 8;
77 data |= byte0;
78 return data;
79}
82{
83 NS_LOG_FUNCTION (this);
84 uint8_t byte0 = ReadU8 ();
85 uint8_t byte1 = ReadU8 ();
86 uint8_t byte2 = ReadU8 ();
87 uint8_t byte3 = ReadU8 ();
88 uint32_t data = byte3;
89 data <<= 8;
90 data |= byte2;
91 data <<= 8;
92 data |= byte1;
93 data <<= 8;
94 data |= byte0;
95 return data;
96}
97
98#endif /* TAG_BUFFER_USE_INLINE */
99
100
101void
103{
104 NS_LOG_FUNCTION (this << data);
105 WriteU8 ((data >> 0) & 0xff);
106 WriteU8 ((data >> 8) & 0xff);
107 WriteU8 ((data >> 16) & 0xff);
108 WriteU8 ((data >> 24) & 0xff);
109 WriteU8 ((data >> 32) & 0xff);
110 WriteU8 ((data >> 40) & 0xff);
111 WriteU8 ((data >> 48) & 0xff);
112 WriteU8 ((data >> 56) & 0xff);
113}
114void
116{
117 NS_LOG_FUNCTION (this << v);
118 uint8_t *buf = (uint8_t *)&v;
119 for (uint32_t i = 0; i < sizeof (double); ++i, ++buf)
120 {
121 WriteU8 (*buf);
122 }
123}
124void
125TagBuffer::Write (const uint8_t *buffer, uint32_t size)
126{
127 NS_LOG_FUNCTION (this << &buffer << size);
128 for (uint32_t i = 0; i < size; ++i, ++buffer)
129 {
130 WriteU8 (*buffer);
131 }
132}
133uint64_t
135{
136 NS_LOG_FUNCTION (this);
137 uint8_t byte0 = ReadU8 ();
138 uint8_t byte1 = ReadU8 ();
139 uint8_t byte2 = ReadU8 ();
140 uint8_t byte3 = ReadU8 ();
141 uint8_t byte4 = ReadU8 ();
142 uint8_t byte5 = ReadU8 ();
143 uint8_t byte6 = ReadU8 ();
144 uint8_t byte7 = ReadU8 ();
145 uint64_t data = byte7;
146 data <<= 8;
147 data |= byte6;
148 data <<= 8;
149 data |= byte5;
150 data <<= 8;
151 data |= byte4;
152 data <<= 8;
153 data |= byte3;
154 data <<= 8;
155 data |= byte2;
156 data <<= 8;
157 data |= byte1;
158 data <<= 8;
159 data |= byte0;
160
161 return data;
162}
163double
165{
166 NS_LOG_FUNCTION (this);
167 double v;
168 uint8_t *buf = (uint8_t *)&v;
169 for (uint32_t i = 0; i < sizeof (double); ++i, ++buf)
170 {
171 *buf = ReadU8 ();
172 }
173 return v;
174}
175void
176TagBuffer::Read (uint8_t *buffer, uint32_t size)
177{
178 NS_LOG_FUNCTION (this << &buffer << size);
179 std::memcpy (buffer, m_current, size);
180 m_current += size;
182}
183TagBuffer::TagBuffer (uint8_t *start, uint8_t *end)
184 : m_current (start),
185 m_end (end)
186{
187 NS_LOG_FUNCTION (this << &start << &end);
188}
189
190void
192{
193 NS_LOG_FUNCTION (this << trim);
194 NS_ASSERT (m_current <= (m_end - trim));
195 m_end -= trim;
196}
197
198void
200{
201 NS_LOG_FUNCTION (this << &o);
202 NS_ASSERT (o.m_end >= o.m_current);
204 uintptr_t size = o.m_end - o.m_current;
205 NS_ASSERT (size <= (uintptr_t)(m_end - m_current));
206 std::memcpy (m_current, o.m_current, size);
207 m_current += size;
208}
209
210} // namespace ns3
211
read and write tag data
Definition: tag-buffer.h:52
TagBuffer(uint8_t *start, uint8_t *end)
Constructor.
Definition: tag-buffer.cc:183
void WriteU64(uint64_t v)
Definition: tag-buffer.cc:102
void TrimAtEnd(uint32_t trim)
Trim some space from the end.
Definition: tag-buffer.cc:191
void Read(uint8_t *buffer, uint32_t size)
Definition: tag-buffer.cc:176
TAG_BUFFER_INLINE uint16_t ReadU16(void)
Definition: tag-buffer.h:205
void WriteDouble(double v)
Definition: tag-buffer.cc:115
TAG_BUFFER_INLINE uint32_t ReadU32(void)
Definition: tag-buffer.h:215
TAG_BUFFER_INLINE void WriteU8(uint8_t v)
Definition: tag-buffer.h:172
double ReadDouble(void)
Definition: tag-buffer.cc:164
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
Definition: tag-buffer.h:186
uint64_t ReadU64(void)
Definition: tag-buffer.cc:134
uint8_t * m_current
current TagBuffer position
Definition: tag-buffer.h:159
uint8_t * m_end
end TagBuffer position
Definition: tag-buffer.h:160
void Write(const uint8_t *buffer, uint32_t size)
Definition: tag-buffer.cc:125
TAG_BUFFER_INLINE void WriteU16(uint16_t v)
Definition: tag-buffer.h:180
TAG_BUFFER_INLINE uint8_t ReadU8(void)
Definition: tag-buffer.h:195
void CopyFrom(TagBuffer o)
Copy the nternal structure of another TagBuffer.
Definition: tag-buffer.cc:199
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
def start()
Definition: core.py:1852
uint8_t data[writeSize]