DCCL v4
Loading...
Searching...
No Matches
field_codec_id.cpp
1// Copyright 2014-2023:
2// GobySoft, LLC (2013-)
3// Massachusetts Institute of Technology (2007-2014)
4// Community contributors (see AUTHORS file)
5// File authors:
6// Toby Schneider <toby@gobysoft.org>
7//
8//
9// This file is part of the Dynamic Compact Control Language Library
10// ("DCCL").
11//
12// DCCL is free software: you can redistribute it and/or modify
13// it under the terms of the GNU Lesser General Public License as published by
14// the Free Software Foundation, either version 2.1 of the License, or
15// (at your option) any later version.
16//
17// DCCL is distributed in the hope that it will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20// GNU Lesser General Public License for more details.
21//
22// You should have received a copy of the GNU Lesser General Public License
23// along with DCCL. If not, see <http://www.gnu.org/licenses/>.
24#include "field_codec_id.h"
25
26//
27// DefaultIdentifierCodec
28//
29
31
33{
34 if (id <= ONE_BYTE_MAX_ID)
35 {
36 return (dccl::Bitset(this_size(id), id) << 1);
37 }
38 else
39 {
40 dccl::Bitset return_bits(this_size(id), id);
41 return_bits <<= 1;
42 // set LSB to indicate long header form
43 return_bits.set(0, true);
44
45 return return_bits;
46 }
47}
48
50{
51 if (bits->test(0))
52 {
53 // long header
54 // grabs more bits to add to the MSB of `bits`
55 bits->get_more_bits((LONG_FORM_ID_BYTES - SHORT_FORM_ID_BYTES) * BITS_IN_BYTE);
56 // discard identifier
57 *(bits) >>= 1;
58 return bits->to_ulong();
59 }
60 else
61 {
62 // short header
63 *(bits) >>= 1;
64 return bits->to_ulong();
65 }
66}
67
68unsigned dccl::DefaultIdentifierCodec::size() { return this_size(0); }
69
70unsigned dccl::DefaultIdentifierCodec::size(const uint32& id) { return this_size(id); }
71
72unsigned dccl::DefaultIdentifierCodec::this_size(const uint32& id)
73{
74 if (id > TWO_BYTE_MAX_ID)
75 throw(Exception(
76 "dccl.id provided (" + std::to_string(id) +
77 ") exceeds maximum: " + std::to_string(int(TWO_BYTE_MAX_ID))));
78
79 return (id <= ONE_BYTE_MAX_ID) ? SHORT_FORM_ID_BYTES * BITS_IN_BYTE
80 : LONG_FORM_ID_BYTES * BITS_IN_BYTE;
81}
82
83unsigned dccl::DefaultIdentifierCodec::max_size() { return LONG_FORM_ID_BYTES * BITS_IN_BYTE; }
84
85unsigned dccl::DefaultIdentifierCodec::min_size() { return SHORT_FORM_ID_BYTES * BITS_IN_BYTE; }
A variable size container of bits (subclassed from std::deque<bool>) with an optional hierarchy....
Definition bitset.h:43
void get_more_bits(size_type num_bits)
Retrieve more bits from the parent Bitset.
Definition bitset.h:420
bool test(size_type n) const
Test a bit (return its value)
Definition bitset.h:224
unsigned long to_ulong() const
Returns the value of the Bitset as an unsigned long integer. Equivalent to to<unsigned long>().
Definition bitset.h:275
Bitset & set(size_type n, bool val=true)
Set a bit to a given value.
Definition bitset.h:175
Bitset encode() override
Encode an empty field.
unsigned size() override
Calculate the size (in bits) of an empty field.
uint32 decode(Bitset *bits) override
Decode a field. If the field is empty (i.e. was encoded using the zero-argument encode()),...
unsigned min_size() override
Calculate minimum size of the field in bits.
unsigned max_size() override
Calculate maximum size of the field in bits.
Exception class for DCCL.
Definition exception.h:47
google::protobuf::uint32 uint32
an unsigned 32 bit integer
Definition common.h:56