GCC Code Coverage Report


Directory: ./
File: Fw/Buffer/Buffer.cpp
Date: 2026-11-03 21:15:54
Exec Total Coverage
Lines: 131 150 87.3%
Functions: 21 23 91.3%
Branches: 58 76 76.3%

Line Branch Exec Source
1 // ======================================================================
2 // \title Buffer.cpp
3 // \author mstarch
4 // \brief cpp file for Fw::Buffer implementation
5 //
6 // \copyright
7 // Copyright 2009-2020, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 //
11 // ======================================================================
12 #include <Fw/Buffer/Buffer.hpp>
13 #include <Fw/FPrimeBasicTypes.hpp>
14 #include <Fw/Types/Assert.hpp>
15
16 #if FW_SERIALIZABLE_TO_STRING
17 #include <Fw/Types/String.hpp>
18 #endif
19 #include <cstring>
20
21 namespace Fw {
22
23 1532065 Buffer::Buffer()
24 : Serializable(),
25
1/1
✓ Branch 4 taken 1532065 times.
1532065 m_serialize_repr(),
26 1532065 m_bufferData(nullptr),
27 1532065 m_offset(0),
28 1532065 m_size(0),
29 1532065 m_capacity(0),
30 3064130 m_context(0xFFFFFFFF) {}
31
32 40070 Buffer::Buffer(const Buffer& src)
33 : Serializable(),
34
1/1
✓ Branch 4 taken 40070 times.
40070 m_serialize_repr(),
35 40070 m_bufferData(src.m_bufferData),
36 40070 m_offset(src.m_offset),
37 40070 m_size(src.m_size),
38 40070 m_capacity(src.m_capacity),
39 80140 m_context(src.m_context) {
40
2/2
✓ Branch 4 taken 40068 times.
✓ Branch 5 taken 2 times.
40070 if (src.m_bufferData != nullptr) {
41
1/1
✓ Branch 19 taken 40068 times.
40068 this->m_serialize_repr.setExtBuffer(this->m_bufferData + this->m_offset, this->m_size);
42 }
43 40070 }
44
45 595130 Buffer::Buffer(U8* data, FwSizeType size, U32 context)
46 : Serializable(),
47
1/1
✓ Branch 4 taken 595130 times.
595130 m_serialize_repr(),
48 595130 m_bufferData(data),
49 595130 m_offset(0),
50 595130 m_size(size),
51 595130 m_capacity(size),
52 1190260 m_context(context) {
53
2/2
✓ Branch 4 taken 595128 times.
✓ Branch 5 taken 2 times.
595130 if (m_bufferData != nullptr) {
54
1/1
✓ Branch 14 taken 595128 times.
595128 this->m_serialize_repr.setExtBuffer(this->m_bufferData, this->m_size);
55 }
56 595130 }
57
58 1275095 Buffer& Buffer::operator=(const Buffer& src) {
59 // Ward against self-assignment
60
2/2
✓ Branch 0 taken 1275093 times.
✓ Branch 1 taken 2 times.
1275095 if (this != &src) {
61 1275093 this->m_bufferData = src.m_bufferData;
62 1275093 this->m_offset = src.m_offset;
63 1275093 this->m_size = src.m_size;
64 1275093 this->m_capacity = src.m_capacity;
65 1275093 this->m_context = src.m_context;
66
2/2
✓ Branch 4 taken 1268031 times.
✓ Branch 5 taken 7062 times.
1275093 if (this->m_bufferData != nullptr) {
67 1268031 this->m_serialize_repr.setExtBuffer(this->m_bufferData + this->m_offset, this->m_size);
68 }
69 }
70 1275095 return *this;
71 }
72
73 39192 bool Buffer::operator==(const Buffer& src) const {
74
1/2
✓ Branch 16 taken 39192 times.
✗ Branch 17 not taken.
78384 return (this->m_bufferData == src.m_bufferData) && (this->m_offset == src.m_offset) &&
75
4/8
✓ Branch 0 taken 39192 times.
✗ Branch 1 not taken.
✓ Branch 10 taken 39192 times.
✗ Branch 11 not taken.
✓ Branch 20 taken 39192 times.
✗ Branch 21 not taken.
✓ Branch 30 taken 39192 times.
✗ Branch 31 not taken.
78384 (this->m_size == src.m_size) && (this->m_capacity == src.m_capacity) && (this->m_context == src.m_context);
76 }
77
78 243758 bool Buffer::isValid() const {
79
4/4
✓ Branch 4 taken 232508 times.
✓ Branch 5 taken 11250 times.
✓ Branch 10 taken 232507 times.
✓ Branch 11 taken 1 times.
243758 return (this->m_bufferData != nullptr) && (this->m_size > 0);
80 }
81
82 32653945 U8* Buffer::getData() const {
83
2/2
✓ Branch 4 taken 32643846 times.
✓ Branch 5 taken 10099 times.
32653945 return (this->m_bufferData == nullptr) ? nullptr : (this->m_bufferData + this->m_offset);
84 }
85
86 6 U8* Buffer::getOriginalData() const {
87 6 return this->m_bufferData;
88 }
89
90 15469977 FwSizeType Buffer::getSize() const {
91 15469977 return this->m_size;
92 }
93
94 4 FwSizeType Buffer::getCapacity() const {
95 4 return this->m_capacity;
96 }
97
98 6 FwSizeType Buffer::getOffset() const {
99 6 return this->m_offset;
100 }
101
102 12718 U32 Buffer::getContext() const {
103 12718 return this->m_context;
104 }
105
106 4101 void Buffer::advance(const FwSignedSizeType amount) {
107 4101 FW_ASSERT(this->m_bufferData != nullptr);
108 // New offset must remain within [0, capacity]
109
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4100 times.
4101 if (amount < 0) {
110 1 FW_ASSERT(this->m_offset >= static_cast<FwSizeType>(-amount), static_cast<FwAssertArgType>(this->m_offset),
111 static_cast<FwAssertArgType>(amount));
112 } else {
113 // Advancing must not move past the end of the represented data
114 4100 FW_ASSERT(static_cast<FwSizeType>(amount) <= this->m_size, static_cast<FwAssertArgType>(this->m_size),
115 static_cast<FwAssertArgType>(amount));
116 }
117 4101 this->m_offset = static_cast<FwSizeType>(static_cast<FwSignedSizeType>(this->m_offset) + amount);
118 // Keep the end of the represented data fixed
119 4101 this->m_size = static_cast<FwSizeType>(static_cast<FwSignedSizeType>(this->m_size) - amount);
120 4101 FW_ASSERT(this->m_offset + this->m_size <= this->m_capacity, static_cast<FwAssertArgType>(this->m_offset),
121 static_cast<FwAssertArgType>(this->m_size), static_cast<FwAssertArgType>(this->m_capacity));
122 4101 this->m_serialize_repr.setExtBuffer(this->m_bufferData + this->m_offset, this->m_size);
123 4101 }
124
125 2443 void Buffer::setData(U8* const data) {
126 2443 FW_ASSERT(this->m_bufferData != nullptr);
127 2443 FW_ASSERT(data >= this->m_bufferData && data <= &this->m_bufferData[this->m_capacity]);
128 2443 this->advance(static_cast<FwSignedSizeType>(data - (this->m_bufferData + this->m_offset)));
129 2443 }
130
131 406563 void Buffer::setSize(const FwSizeType size) {
132 406563 FW_ASSERT(this->m_offset + size <= this->m_capacity, static_cast<FwAssertArgType>(this->m_offset),
133 static_cast<FwAssertArgType>(size), static_cast<FwAssertArgType>(this->m_capacity));
134 406563 this->m_size = size;
135
1/2
✓ Branch 4 taken 406563 times.
✗ Branch 5 not taken.
406563 if (m_bufferData != nullptr) {
136 406563 this->m_serialize_repr.setExtBuffer(this->m_bufferData + this->m_offset, this->m_size);
137 }
138 406563 }
139
140 4906 void Buffer::setContext(const U32 context) {
141 4906 this->m_context = context;
142 4906 }
143
144 31326 void Buffer::set(U8* const data, const FwSizeType size, const U32 context) {
145 31326 this->m_bufferData = data;
146 31326 this->m_offset = 0;
147 31326 this->m_size = size;
148 31326 this->m_capacity = size;
149
2/2
✓ Branch 4 taken 21248 times.
✓ Branch 5 taken 10078 times.
31326 if (m_bufferData != nullptr) {
150 21248 this->m_serialize_repr.setExtBuffer(this->m_bufferData, this->m_size);
151 }
152 31326 this->m_context = context;
153 31326 }
154
155 60323 Fw::ExternalSerializeBufferWithMemberCopy Buffer::getSerializer() {
156
2/2
✓ Branch 4 taken 60322 times.
✓ Branch 5 taken 1 times.
60323 if (this->isValid()) {
157
1/1
✓ Branch 15 taken 60322 times.
60322 Fw::ExternalSerializeBufferWithMemberCopy esb(this->m_bufferData + this->m_offset, this->m_size);
158
1/1
✓ Branch 2 taken 60322 times.
60322 esb.resetSer();
159
1/1
✓ Branch 1 taken 60322 times.
60322 return esb;
160 60322 } else {
161 1 return ExternalSerializeBufferWithMemberCopy();
162 }
163 }
164
165 76253 Fw::ExternalSerializeBufferWithMemberCopy Buffer::getDeserializer() {
166
2/2
✓ Branch 4 taken 76252 times.
✓ Branch 5 taken 1 times.
76253 if (this->isValid()) {
167
1/1
✓ Branch 15 taken 76252 times.
76252 Fw::ExternalSerializeBufferWithMemberCopy esb(this->m_bufferData + this->m_offset, this->m_size);
168
1/1
✓ Branch 6 taken 76252 times.
76252 Fw::SerializeStatus stat = esb.setBuffLen(this->m_size);
169 76252 FW_ASSERT(stat == Fw::FW_SERIALIZE_OK);
170
1/1
✓ Branch 1 taken 76252 times.
76252 return esb;
171 76252 } else {
172 1 return ExternalSerializeBufferWithMemberCopy();
173 }
174 }
175
176 13733 Fw::SerializeStatus Buffer::serializeTo(Fw::SerialBufferBase& buffer, Fw::Endianness mode) const {
177 Fw::SerializeStatus stat;
178 13733 stat = buffer.serializeFrom(reinterpret_cast<PlatformPointerCastType>(this->m_bufferData), mode);
179
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13733 times.
13733 if (stat != Fw::FW_SERIALIZE_OK) {
180 ✗ return stat;
181 }
182 13733 stat = buffer.serializeFrom(this->m_size, mode);
183
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13733 times.
13733 if (stat != Fw::FW_SERIALIZE_OK) {
184 ✗ return stat;
185 }
186 13733 stat = buffer.serializeFrom(this->m_context, mode);
187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13733 times.
13733 if (stat != Fw::FW_SERIALIZE_OK) {
188 ✗ return stat;
189 }
190 13733 stat = buffer.serializeFrom(this->m_offset, mode);
191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13733 times.
13733 if (stat != Fw::FW_SERIALIZE_OK) {
192 ✗ return stat;
193 }
194 13733 stat = buffer.serializeFrom(this->m_capacity, mode);
195
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 13732 times.
13733 if (stat != Fw::FW_SERIALIZE_OK) {
196 1 return stat;
197 }
198 13732 return stat;
199 }
200
201 13699 Fw::SerializeStatus Buffer::deserializeFrom(Fw::SerialBufferBase& buffer, Fw::Endianness mode) {
202 Fw::SerializeStatus stat;
203 13699 PlatformPointerCastType pointer;
204
1/1
✓ Branch 7 taken 13699 times.
13699 stat = buffer.deserializeTo(pointer, mode);
205
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13699 times.
13699 if (stat != Fw::FW_SERIALIZE_OK) {
206 ✗ return stat;
207 }
208 13699 this->m_bufferData = reinterpret_cast<U8*>(pointer);
209
210
1/1
✓ Branch 10 taken 13699 times.
13699 stat = buffer.deserializeTo(this->m_size, mode);
211
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13699 times.
13699 if (stat != Fw::FW_SERIALIZE_OK) {
212 ✗ return stat;
213 }
214
1/1
✓ Branch 10 taken 13699 times.
13699 stat = buffer.deserializeTo(this->m_context, mode);
215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13699 times.
13699 if (stat != Fw::FW_SERIALIZE_OK) {
216 ✗ return stat;
217 }
218
1/1
✓ Branch 10 taken 13699 times.
13699 stat = buffer.deserializeTo(this->m_offset, mode);
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13699 times.
13699 if (stat != Fw::FW_SERIALIZE_OK) {
220 ✗ return stat;
221 }
222
1/1
✓ Branch 10 taken 13699 times.
13699 stat = buffer.deserializeTo(this->m_capacity, mode);
223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13699 times.
13699 if (stat != Fw::FW_SERIALIZE_OK) {
224 ✗ return stat;
225 }
226
227
2/2
✓ Branch 4 taken 12743 times.
✓ Branch 5 taken 956 times.
13699 if (this->m_bufferData != nullptr) {
228
1/1
✓ Branch 19 taken 12743 times.
12743 this->m_serialize_repr.setExtBuffer(this->m_bufferData + this->m_offset, this->m_size);
229 }
230 13699 return stat;
231 }
232
233 #if FW_SERIALIZABLE_TO_STRING
234 ✗ void Buffer::toString(Fw::StringBase& text) const {
235 static const char* formatString = "(data = %p, size = %u, context = %u, offset = %u, capacity = %u)";
236 ✗ (void)text.format(formatString, this->m_bufferData, this->m_size, this->m_context, this->m_offset,
237 ✗ this->m_capacity); // display string may safely truncate
238 ✗ }
239 #endif
240
241 #ifdef BUILD_UT
242 ✗ std::ostream& operator<<(std::ostream& os, const Buffer& obj) {
243 ✗ Fw::String str;
244 ✗ obj.toString(str);
245 ✗ os << str.toChar();
246 ✗ return os;
247 ✗ }
248 #endif
249
250 } // end namespace Fw
251