25#ifndef JAU_OCTETS_HPP_
26#define JAU_OCTETS_HPP_
31#include <initializer_list>
43#ifdef JAU_TRACE_OCTETS
44 #define JAU_TRACE_OCTETS_PRINT(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); fflush(stderr); }
46 #define JAU_TRACE_OCTETS_PRINT(...)
84 if(
nullptr == data_ && 0 < size_ ) {
85 jau_ABORT(
"TROOctets: nullptr with size %s > 0", std::to_string(size_).c_str());
90 constexpr uint8_t *
data() noexcept {
return _data; }
103 _size, _data, size_, data_);
122 : _size( len ), _data(
const_cast<uint8_t *
>(source) ),
123 _byte_order( byte_order_val )
135 : _size( 0 ), _data(
nullptr ),
147 if( i+count > _size ) {
153 return i+count <= _size;
237 return std::string( (
const char*)(_data+i) );
241 return std::string( (
const char*)(_data+i) );
247 return std::string( (
const char*)(_data+i), length );
270 constexpr uint8_t
const *
get_ptr() const noexcept {
return _data; }
280 return _size == rhs._size && 0 == std::memcmp(_data, rhs._data, _size);
283 return !(*
this == rhs);
290 .append(std::to_string(_size))
330 data()[i] =
static_cast<uint8_t
>(v);
333 data()[i] =
static_cast<uint8_t
>(v);
405 std::memcpy(
data() + i, v.get_ptr(), v.size());
413 const nsize_t size = std::min(v.size()-v_off, v_len);
414 std::memcpy(
data() + i, v.get_ptr() + v_off,
size);
419 std::memcpy(
data() + i, source, byte_count);
422 std::memcpy(
data() + i, source, byte_count);
427 std::memmove(
data() + i, source, byte_count);
430 std::memmove(
data() + i, source, byte_count);
435 std::memset(
data() + i, c, byte_count);
438 std::memset(
data() + i, c, byte_count);
454 const nsize_t size1 = v.size() + ( includeEOS ? 1 : 0 );
457 std::memcpy(
data() + i, v.c_str(),
size);
458 if(
size < size1 && includeEOS ) {
463 const nsize_t size1 = v.size() + ( includeEOS ? 1 : 0 );
465 std::memcpy(
data() + i, v.c_str(),
size);
466 if(
size < size1 && includeEOS ) {
516 : _parent(buffer_), _offset(offset_), _size(size_)
518 if( offset_+_size > buffer_.
size() ) {
519 throw IndexOutOfBoundsError(offset_, _size, buffer_.size(), E_FILE_LINE);
531 return _parent.get_uint8(_offset+i);
534 return _parent.get_uint8_nc(_offset+i);
538 return _parent.get_uint16(_offset+i);
541 return _parent.get_uint16_nc(_offset+i);
545 return _parent.get_ptr(_offset+i);
548 return _parent.get_ptr_nc(_offset+i);
552 return string_noexcept([&](){
return "offset "+std::to_string(_offset)+
", size "+std::to_string(_size)+
": "+
toHexString(_parent.get_ptr()+_offset, _size); } );
570 uint8_t * ptr =
data();
571 if(
nullptr != ptr ) {
583 [[nodiscard]]
static uint8_t * allocData(
const nsize_t size) {
587 uint8_t * m =
static_cast<uint8_t*
>( std::malloc(
size) );
630 if(
nullptr == source_ ) {
633 std::memcpy(
data(), source_, size_);
650 _capacity( sourcelist.
size() )
652 if( 0 < _capacity ) {
653 std::memcpy(
data(), sourcelist.begin(), _capacity);
669 _capacity( capacity_ )
700 _capacity( source.
size() )
716 _capacity(
std::
max(capacity_, source.
size()) )
727 :
TOctets( o.data(), o.size(), o.byte_order() ),
728 _capacity( o.capacity() )
732 o.setData(
nullptr, 0, o.byte_order());
744 if(
this == &_source ) {
749 _capacity = _source.
size();
762 setData(o.data(), o.size(), o.byte_order());
763 _capacity = o._capacity;
765 o.setData(
nullptr, 0, o.byte_order());
784 _capacity( _source.
size() )
797 if(
static_cast<TROOctets *
>(
this) == &_source ) {
802 _capacity = _source.
size();
815 _capacity( _source.
size() )
830 _capacity = _source.
size();
845 if( newCapacity < newSize ) {
848 if( newCapacity != _capacity ) {
849 if( newSize >
size() ) {
869 if( _capacity < newSize ) {
885 if( newCapacity <
size() ) {
888 if( newCapacity == _capacity ) {
891 uint8_t* data2 = allocData(newCapacity);
898 _capacity = newCapacity;
911 if( _capacity < newSize ) {
928 if( _capacity < newSize ) {
950 template<jau::n
size_t FixedSize>
988 }
else if( 0 < source_size_ ) {
989 if(
nullptr == source_ ) {
992 std::memcpy(
data(), source_, source_size_);
1010 throw IllegalArgumentError(
"source size "+std::to_string(sourcelist.size())+
" > capacity "+std::to_string(fixed_size), E_FILE_LINE);
1011 }
else if( 0 < sourcelist.size() ) {
1012 std::memcpy(data(), sourcelist.begin(), sourcelist.size());
1029 throw IllegalArgumentError(
"source size "+std::to_string(source.size())+
" > capacity "+std::to_string(fixed_size), E_FILE_LINE);
1030 }
else if( 0 < source.
size() ) {
1031 std::memcpy(data(), source.get_ptr(), source.size());
1043 if(
this == &_source ) {
1048 }
else if( 0 < _source.
size() ) {
1049 std::memcpy(smem, _source.
get_ptr(), _source.
size());
AOctets(const TROOctets &source)
Copy constructor.
static constexpr const jau::nsize_t fixed_size
Fixed maximum size.
~AOctets() noexcept override
AOctets & operator=(const TROOctets &_source)
Assignment operator.
AOctets(const lb_endian_t byte_order) noexcept
Sized AOctets instance.
std::string toString() const noexcept
AOctets & resize(const nsize_t newSize)
Sets a new size for this instance.
AOctets(const uint8_t *source_, const nsize_t source_size_, const lb_endian_t byte_order)
Takes ownership (malloc(size) and copy, free) .
AOctets(std::initializer_list< uint8_t > sourcelist, const lb_endian_t byte_order)
Takes ownership (malloc(size) and copy, free) .
POctets & operator=(const TROOctets &_source)
Assignment operator for TROOctets.
POctets(POctets &&o) noexcept
Move constructor.
POctets & operator=(POctets &&o) noexcept
Move assignment operator.
POctets(const nsize_t capacity_, const nsize_t size_, const lb_endian_t byte_order)
New buffer (malloc(capacity), free)
POctets(const POctets &source)
Copy constructor.
POctets & operator=(const POctets &_source)
Assignment operator.
POctets(const nsize_t size, const lb_endian_t byte_order)
New buffer (malloc, free)
POctets(const TROOctets &_source)
Makes a persistent POctets by copying the data from TROOctets.
~POctets() noexcept override
POctets & resize(const nsize_t newCapacity, const nsize_t newSize)
Resizes this instance, including its capacity.
POctets & operator=(const TOctetSlice &_source)
Assignment operator for TOctetSlice.
POctets & operator+=(const TOctetSlice &b)
Append and assign operator.
constexpr nsize_t remaining() const noexcept
Returns the remaining octets for put left, i.e.
POctets(const POctets &source, const nsize_t capacity_)
Copy constructor (explicit), allowing to set a higher capacity than source.size() in contrast to the ...
std::string toString() const noexcept
POctets & recapacity(const nsize_t newCapacity)
Changes the capacity.
constexpr nsize_t capacity() const noexcept
Returns the memory capacity, never zero, greater or equal size().
POctets(std::initializer_list< uint8_t > sourcelist, const lb_endian_t byte_order)
Takes ownership (malloc(size) and copy, free) .
POctets & resize(const nsize_t newSize)
Sets a new size for this instance.
POctets(const lb_endian_t byte_order) noexcept
Zero sized POctets instance.
POctets & operator+=(const TROOctets &b)
Append and assign operator.
POctets(const TOctetSlice &_source)
Makes a persistent POctets by copying the data from TOctetSlice.
POctets(const uint8_t *source_, const nsize_t size_, const lb_endian_t byte_order)
Takes ownership (malloc(size) and copy, free) .
Transient endian aware octet data slice, i.e.
std::string toString() const noexcept
uint8_t get_uint8(const nsize_t i) const
constexpr lb_endian_t byte_order() const noexcept
Returns byte order of this octet store.
constexpr nsize_t offset() const noexcept
constexpr nsize_t size() const noexcept
constexpr const TOctets & parent() const noexcept
uint16_t get_uint16(const nsize_t i) const
constexpr uint16_t get_uint16_nc(const nsize_t i) const noexcept
constexpr uint8_t const * get_ptr_nc(const nsize_t i) const noexcept
TOctetSlice(const TOctets &buffer_, const nsize_t offset_, const nsize_t size_)
Creates a view of a given TOctet with the specified offset_ and size_.
uint8_t const * get_ptr(const nsize_t i) const
constexpr uint8_t get_uint8_nc(const nsize_t i) const noexcept
Transient endian aware octet data, i.e.
constexpr void put_uint64_nc(const nsize_t i, const uint64_t &v) noexcept
void put_uint128(const nsize_t i, const uint128dp_t &v)
void put_octets_nc(const nsize_t i, const TROOctets &v, const nsize_t v_off, const nsize_t v_len) noexcept
void memset(const nsize_t i, const uint8_t c, const nsize_t byte_count)
void put_uint64(const nsize_t i, const uint64_t &v)
TOctets(TOctets &&o) noexcept=default
void put_eui48(const nsize_t i, const jau::io::net::EUI48 &v)
TOctets(uint8_t *source, const nsize_t len, const lb_endian_t byte_order) noexcept
Transient passthrough r/w memory, w/o ownership .
void memmove_nc(const nsize_t i, const uint8_t *source, const nsize_t byte_count) noexcept
void put_eui48_nc(const nsize_t i, const jau::io::net::EUI48 &v) noexcept
std::string toString() const noexcept
TOctets & operator=(const TOctets &o) noexcept=default
constexpr void put_uint32_nc(const nsize_t i, const uint32_t v) noexcept
void put_octets_nc(const nsize_t i, const TROOctets &v) noexcept
void put_uint192(const nsize_t i, const uint192dp_t &v)
void bzero_nc(const nsize_t i, const nsize_t byte_count) noexcept
void put_bytes_nc(const nsize_t i, const uint8_t *source, const nsize_t byte_count) noexcept
void put_string(const nsize_t i, const std::string &v, const nsize_t max_len, const bool includeEOS)
void put_octets(const nsize_t i, const TROOctets &v)
void bzero(const nsize_t i, const nsize_t byte_count)
TOctets(const TOctets &o) noexcept=default
void put_uint256(const nsize_t i, const uint256dp_t &v)
constexpr void put_uint256_nc(const nsize_t i, const uint256dp_t &v) noexcept
TOctets & operator=(TOctets &&o) noexcept=default
constexpr void put_uint128_nc(const nsize_t i, const uint128dp_t &v) noexcept
constexpr void put_uint16_nc(const nsize_t i, const uint16_t v) noexcept
~TOctets() noexcept override=default
constexpr void put_uint8_nc(const nsize_t i, const uint8_t v) noexcept
uint8_t * get_wptr() noexcept
void memset_nc(const nsize_t i, const uint8_t c, const nsize_t byte_count) noexcept
void put_uint32(const nsize_t i, const uint32_t v)
void put_octets(const nsize_t i, const TROOctets &v, const nsize_t v_off, const nsize_t v_len)
void put_string_nc(const nsize_t i, const std::string &v, const nsize_t max_len, const bool includeEOS) noexcept
constexpr void put_int8_nc(const nsize_t i, const int8_t v) noexcept
void memmove(const nsize_t i, const uint8_t *source, const nsize_t byte_count)
uint8_t * get_wptr(const nsize_t i)
void put_uint16(const nsize_t i, const uint16_t v)
void put_uuid(const nsize_t i, const uuid_t &v)
constexpr void put_uint192_nc(const nsize_t i, const uint192dp_t &v) noexcept
void put_bytes(const nsize_t i, const uint8_t *source, const nsize_t byte_count)
void put_uuid_nc(const nsize_t i, const uuid_t &v) noexcept
uint8_t * get_wptr_nc(const nsize_t i) noexcept
void put_int8(const nsize_t i, const int8_t v)
void put_uint8(const nsize_t i, const uint8_t v)
Transient read only and endian aware octet data, i.e.
uint32_t get_uint32(const nsize_t i) const
constexpr uint16_t get_uint16_nc(const nsize_t i) const noexcept
jau::io::net::EUI48 get_eui48(const nsize_t i) const
TROOctets & operator=(const TROOctets &o) noexcept=default
std::unique_ptr< const uuid_t > get_uuid(const nsize_t i, const uuid_t::TypeSize tsize) const
uuid128_t get_uuid128_nc(const nsize_t i) const noexcept
constexpr uint128dp_t get_uint128_nc(const nsize_t i) const noexcept
std::string toString() const noexcept
jau::io::net::EUI48 get_eui48_nc(const nsize_t i) const noexcept
constexpr lb_endian_t byte_order() const noexcept
Returns byte order of this octet store.
uint128dp_t get_uint128(const nsize_t i) const
std::string get_string(const nsize_t i) const
Assumes a null terminated string.
TROOctets(TROOctets &&o) noexcept=default
TROOctets() noexcept
Default constructor with nullptr memory, zero size and lb_endian::native byte order.
TROOctets(const uint8_t *source, const nsize_t len, const lb_endian_t byte_order_val) noexcept
Transient passthrough read-only memory, w/o ownership .
constexpr nsize_t size() const noexcept
Returns the used memory size for read and write operations, may be zero.
constexpr bool is_range_valid(const nsize_t i, const nsize_t count) const noexcept
bool operator==(const TROOctets &rhs) const noexcept
virtual ~TROOctets() noexcept=default
constexpr int8_t get_int8_nc(const nsize_t i) const noexcept
bool operator!=(const TROOctets &rhs) const noexcept
uuid16_t get_uuid16(const nsize_t i) const
uuid16_t get_uuid16_nc(const nsize_t i) const noexcept
static void checkPtr(uint8_t *data_, nsize_t size_) noexcept
Validates the given data_ and size_.
TROOctets(const TROOctets &o) noexcept=default
uint8_t const * get_ptr(const nsize_t i) const
uint16_t get_uint16(const nsize_t i) const
std::string get_string(const nsize_t i, const nsize_t length) const
Assumes a string with defined length, not necessarily null terminated.
uint8_t get_uint8(const nsize_t i) const
std::string get_string_nc(const nsize_t i) const noexcept
Assumes a null terminated string.
void check_range(const nsize_t i, const nsize_t count, const char *file, int line) const
TROOctets & operator=(TROOctets &&o) noexcept=default
void setData(uint8_t *data_, nsize_t size_, const lb_endian_t byte_order) noexcept
Internally sets the _size and _data fields after validation.
constexpr uint192dp_t get_uint192_nc(const nsize_t i) const noexcept
uint64_t get_uint64(const nsize_t i) const
constexpr uint256dp_t get_uint256_nc(const nsize_t i) const noexcept
int8_t get_int8(const nsize_t i) const
constexpr uint8_t * data() noexcept
uint256dp_t get_uint256(const nsize_t i) const
uint192dp_t get_uint192(const nsize_t i) const
constexpr uint32_t get_uint32_nc(const nsize_t i) const noexcept
constexpr uint64_t get_uint64_nc(const nsize_t i) const noexcept
constexpr uint8_t get_uint8_nc(const nsize_t i) const noexcept
constexpr uint8_t const * get_ptr() const noexcept
constexpr void setSize(nsize_t s) noexcept
uuid128_t get_uuid128(const nsize_t i) const
constexpr uint8_t const * get_ptr_nc(const nsize_t i) const noexcept
static constexpr jau::nsize_t number(const TypeSize rhs) noexcept
virtual jau::nsize_t put(uint8_t *const buffer, lb_endian_t const le_or_be) const noexcept=0
TypeSize
Underlying integer value present octet count.
jau::nsize_t getTypeSizeInt() const noexcept
static std::unique_ptr< uuid_t > create(TypeSize const t, uint8_t const *const buffer, lb_endian_t const le_or_be)
#define jau_ABORT(...)
Use for unconditional ::abort() call with given messages, prefix '[elapsed_time] ABORT @ file:line fu...
constexpr uint192dp_t get_uint192(uint8_t const *buffer) noexcept
See get_uint16() for reference.
constexpr uint128dp_t get_uint128(uint8_t const *buffer) noexcept
See get_uint16() for reference.
constexpr void put_uint256(uint8_t *buffer, const uint256dp_t &v) noexcept
See put_uint16() for reference.
constexpr uint16_t get_uint16(uint8_t const *buffer) noexcept
Returns a uint16_t value from the given byte address using packed_t to resolve a potential memory ali...
std::string_view to_string(const endian_t v) noexcept
Return std::string representation of the given endian.
constexpr uint32_t get_uint32(uint8_t const *buffer) noexcept
See get_uint16() for reference.
constexpr void put_uint32(uint8_t *buffer, const uint32_t v) noexcept
See put_uint16() for reference.
constexpr uint256dp_t get_uint256(uint8_t const *buffer) noexcept
See get_uint16() for reference.
constexpr void put_uint192(uint8_t *buffer, const uint192dp_t &v) noexcept
See put_uint16() for reference.
lb_endian_t
Simplified reduced endian type only covering little- and big-endian.
constexpr void put_uint64(uint8_t *buffer, const uint64_t &v) noexcept
See put_uint16() for reference.
constexpr void put_uint16(uint8_t *buffer, const uint16_t v) noexcept
Put the given uint16_t value into the given byte address using packed_t to resolve a potential memory...
constexpr void put_uint128(uint8_t *buffer, const uint128dp_t &v) noexcept
See put_uint16() for reference.
constexpr uint64_t get_uint64(uint8_t const *buffer) noexcept
See get_uint16() for reference.
constexpr int8_t get_int8(uint8_t const *buffer) noexcept
@ native
Identifier for native platform type, one of the above.
bool do_noexcept(UnaryPredicate p) noexcept
No throw wrap for given unary predicate p action. Returns true for success (no exception),...
uint_bytes_t< sizeof(unsigned long int)> nsize_t
Natural 'size_t' alternative using uint<XX>_t with xx = sizeof(unsigned long int)*8 as its natural si...
constexpr T min(const T x, const T y) noexcept
Returns the minimum of two integrals (w/ branching) in O(1)
constexpr T max(const T x, const T y) noexcept
Returns the maximum of two integrals (w/ branching) in O(1)
uuid128_t get_uuid128(uint8_t const *buffer) noexcept
void zero_bytes_sec(void *s, size_t n) noexcept __attrdecl_no_optimize__
Wrapper to ::explicit_bzero(), ::bzero() or ::memset(), whichever is available in that order.
std::string string_noexcept(UnaryPredicate p) noexcept
No throw wrap for given unary predicate p producing a std::string. Returns an empty string if p cause...
std::string & appendHexString(std::string &dest, const void *data, const nsize_t length, const lb_endian_t byteOrder=lb_endian_t::big, const LoUpCase capitalization=LoUpCase::lower, const PrefixOpt prefix=PrefixOpt::prefix) noexcept
Appends a hexadecimal string representation of the given lsb-first byte values.
std::string toHexString(const void *data, const nsize_t length, const lb_endian_t byteOrder=lb_endian_t::big, const LoUpCase capitalization=LoUpCase::lower, const PrefixOpt prefix=PrefixOpt::prefix) noexcept
Produce a hexadecimal string representation of the given lsb-first byte values.
__pack(...): Produces MSVC, clang and gcc compatible lead-in and -out macros.
#define JAU_TRACE_OCTETS_PRINT(...)
A packed 48 bit EUI-48 identifier, formerly known as MAC-48 or simply network device MAC address (Med...
jau::nsize_t put(uint8_t *const sink, const lb_endian_t byte_order) const noexcept
A 128-bit packed uint8_t data array.
A 196-bit packed uint8_t data array.
A 256-bit packed uint8_t data array.