59 std::vector<char> structureBuffer;
60 char *structureAddress{};
61 void setAddress(
const char *address);
76 structure(
int __group,
int __item, std::string &str);
82 int length = *
reinterpret_cast<uint32_t *
>(structureAddress+4);
88 int length = *
reinterpret_cast<uint32_t *
>(structureAddress+4);
99 void init(
const char *buffer,
int size);
100 void initNoCopy(
const char *buffer,
int size);
103 virtual void show()
const;
109 return *
reinterpret_cast<int32_t*
>(&structureAddress[index+
dataOffset]);
113 return *
reinterpret_cast<int16_t*
>(&structureAddress[index+
dataOffset]);
116 return *
reinterpret_cast<int8_t*
>(&structureAddress[index+
dataOffset]);
119 return *
reinterpret_cast<float*
>(&structureAddress[index+
dataOffset]);
122 return *
reinterpret_cast<double*
>(&structureAddress[index+
dataOffset]);
125 return *
reinterpret_cast<int64_t*
>(&structureAddress[index+
dataOffset]);
131 *
reinterpret_cast<int32_t*
>(&structureAddress[index+
dataOffset]) = value;
135 *
reinterpret_cast<int16_t*
>(&structureAddress[index+
dataOffset]) = value;
139 *
reinterpret_cast<int8_t*
>(&structureAddress[index+
dataOffset]) = value;
143 *
reinterpret_cast<float*
>(&structureAddress[index+
dataOffset]) = value;
147 *
reinterpret_cast<double*
>(&structureAddress[index+
dataOffset]) = value;
151 *
reinterpret_cast<int64_t*
>(&structureAddress[index+
dataOffset]) = value;
168 std::vector<char> typeChars;
169 std::vector<int> offsets;
170 std::vector<int> types;
174 int getTypeSize(
int type);
184 void parse(std::string format);
199 int getInt (
int element,
int row)
const noexcept;
200 int64_t
getLong (
int element,
int row)
const noexcept;
201 float getFloat (
int element,
int row)
const noexcept;
202 void putInt (
int element,
int row,
int value);
203 void putLong (
int element,
int row, int64_t value);
204 void putFloat (
int element,
int row,
float value);
226 void reset(
int numRows = -1);
249 template <
typename F,
250 std::enable_if_t<std::is_invocable_r_v<bool, F&, bank&, int>,
int> = 0>
254 void filter(
char const* expression);
269 bank* m_owner_bank{
nullptr};
271 bool ownerBankIsUnknown(std::string_view caller =
"");
275 void filterByFunction(std::function<
bool(
bank&,
int)> func);
292 bankSchema = __schema;
297 bankSchema = __schema;
299 int size = bankSchema.getSizeForRows(__rows);
301 bankRowList.reset(bankRows);
308 int getRows() const noexcept{
return bankRows;}
310 int getInt(
int item,
int index)
const noexcept;
311 int getShort(
int item,
int index)
const noexcept;
312 int getByte(
int item,
int index)
const noexcept;
313 float getFloat(
int item,
int index)
const noexcept;
314 double getDouble(
int item,
int index)
const noexcept;
315 long getLong(
int item,
int index)
const noexcept;
317 std::vector<int>
getInt(
int item)
const noexcept;
318 std::vector<float>
getFloat(
int item)
const noexcept;
319 std::vector<double>
getDouble(
int item)
const noexcept;
321 template<
typename T =
double> T
get(
int item,
int index)
const noexcept {
322 auto type = bankSchema.getEntryType(item);
323 auto offset = bankSchema.getOffset(item, index, bankRows);
332 printf(
"---> error(get) : unknown type for [%s] type = %d\n", bankSchema.getEntryName(item).c_str(), type);
337 int getInt(
const char *name,
int index)
const noexcept;
339 int getShort(
const char *name,
int index)
const noexcept;
340 int getByte(
const char *name,
int index)
const noexcept;
341 float getFloat(
const char *name,
int index)
const noexcept;
342 double getDouble(
const char *name,
int index)
const noexcept;
343 long getLong(
const char *name,
int index)
const noexcept;
345 std::vector<int>
getInt(
const char *name)
const noexcept;
346 std::vector<float>
getFloat(
const char *name)
const noexcept;
347 std::vector<double>
getDouble(
const char *name)
const noexcept;
349 template<
typename T =
double> T
get(
const char *name,
int index)
const noexcept {
350 return get<T>(bankSchema.getEntryOrder(name), index);
359 template<
typename T>
void put(
const char *name,
int index,
T value) {
360 put(bankSchema.getEntryOrder(name), index,
value);
369 template<
typename T>
void put(
int item,
int index,
T value) {
370 auto type = bankSchema.getEntryType(item);
379 printf(
"---> error(put) : unknown type for [%s] type = %d\n", bankSchema.getEntryName(item).c_str(), type);
401 void show()
const override;
430 struct sealed_bank :
bank {
431 sealed_bank(sealed_bank
const&) =
delete;
432 sealed_bank(sealed_bank&&) =
delete;
439 template <
typename Sig>
struct sig_first_param;
440 template <
typename R,
typename A0,
typename... As>
441 struct sig_first_param<R(A0, As...)> {
using type = A0; };
442 template <
typename R,
typename A0,
typename... As>
443 struct sig_first_param<R(*)(A0, As...)> {
using type = A0; };
444 template <
typename C,
typename R,
typename A0,
typename... As>
445 struct sig_first_param<R(C::*)(A0, As...)> {
using type = A0; };
446 template <
typename C,
typename R,
typename A0,
typename... As>
447 struct sig_first_param<R(C::*)(A0, As...) const> {
using type = A0; };
451 template <
typename F,
typename =
void>
struct call_signature {
using type = F; };
452 template <
typename F>
453 struct call_signature<F, std::void_t<decltype(&F::operator())>> {
using type =
decltype(&F::operator()); };
456 template <
typename F>
457 using bank_param_t =
typename sig_first_param<typename call_signature<F>::type>::type;
461 template <
typename F,
typename =
void>
462 struct bank_takes_bank_by_ref
463 : std::bool_constant<std::is_invocable_r<bool, F&, sealed_bank&, int>::value> {};
468 template <
typename F>
469 struct bank_takes_bank_by_ref<F, std::void_t<bank_param_t<F>>>
470 : std::is_lvalue_reference<bank_param_t<F>> {};
472 template <
typename F>
473 inline constexpr bool bank_takes_bank_by_ref_v = bank_takes_bank_by_ref<std::decay_t<F>>::value;
478 template <
typename F, std::enable_if_t<std::is_invocable_r_v<
bool, F&, bank&,
int>,
int>>
480 static_assert(detail::bank_takes_bank_by_ref_v<F>,
481 "hipo::bank::rowlist::filter: the callable's bank parameter must be an lvalue reference "
482 "(bank& / bank const& / auto& / auto const&), never by value -- a by-value bank is copied "
483 "per row and the copy shallow-aliases the original's buffer, which can cause a data race "
484 "under multithreaded RDataFrame use.");
485 filterByFunction(std::forward<F>(
func));
493 int offset = bankSchema.
getOffset(item, index, bankRows);
501 int offset = bankSchema.
getOffset(item, index, bankRows);
505 int offset = bankSchema.
getOffset(item, index, bankRows);
513 int offset = bankSchema.
getOffset(item, index, bankRows);
521 int offset = bankSchema.
getOffset(item, index, bankRows);
526 default:
printf(
"---> error : requested INT for [%s] type = %d\n",
535 std::vector<int>
row;
539 int offset = bankSchema.
getOffset(item,
j, bankRows);
544 default:
printf(
"---> error : requested INT for [%s] type = %d\n",
553 int offset = bankSchema.
getOffset(item, index, bankRows);
557 default:
printf(
"---> error : requested SHORT for [%s] type = %d\n",
565 int offset = bankSchema.
getOffset(item, index, bankRows);
568 default:
printf(
"---> error : requested BYTE for [%s] type = %d\n",
576 int offset = bankSchema.
getOffset(item, index, bankRows);
581 default:
printf(
"---> error : requested INT for [%s] type = %d\n",name,type);
break;
589 std::vector<int>
row;
593 int offset = bankSchema.
getOffset(item,
j, bankRows);
598 default:
printf(
"---> error : requested INT for [%s] type = %d\n",name,type);
break;
607 int offset = bankSchema.
getOffset(item, index, bankRows);
611 default:
printf(
"---> error : requested SHORT for [%s] type = %d\n",
619 int offset = bankSchema.
getOffset(item, index, bankRows);
622 default:
printf(
"---> error : requested BYTE for [%s] type = %d\n",
631 int offset = bankSchema.
getOffset(item, index, bankRows);
639 std::vector<float>
row;
643 int offset = bankSchema.
getOffset(item,
j, bankRows);
651 std::vector<float>
row;
655 int offset = bankSchema.
getOffset(item,
j, bankRows);
664 int offset = bankSchema.
getOffset(item, index, bankRows);
668 int offset = bankSchema.
getOffset(item, index, bankRows);
675 std::vector<double>
row;
680 int offset = bankSchema.
getOffset(item,
j, bankRows);
686 int offset = bankSchema.
getOffset(item,
j, bankRows);
694 std::vector<double>
row;
700 int offset = bankSchema.
getOffset(item,
j, bankRows);
706 int offset = bankSchema.
getOffset(item,
j, bankRows);
716 int offset = bankSchema.
getOffset(item, index, bankRows);
723 int offset = bankSchema.
getOffset(item, index, bankRows);
728 int offset = bankSchema.
getOffset(item, index, bankRows);
733 int offset = bankSchema.
getOffset(item, index, bankRows);
738 int offset = bankSchema.
getOffset(item, index, bankRows);
744 int offset = bankSchema.
getOffset(item, index, bankRows);
749 int offset = bankSchema.
getOffset(item, index, bankRows);
rowlist encapsulates a list of rows for this bank, providing a way to iterate over them
Definition bank.h:216
list_t const & getList() const
Definition bank.cpp:355
void setOwnerBank(bank *const ownerBank)
Definition bank.h:264
void setList(list_t const &list)
Definition bank.cpp:361
bool isInitialized() const
Definition bank.h:227
std::vector< int > list_t
Definition bank.h:219
static list_t createFullList(int num)
Definition bank.cpp:398
void filter(F &&func)
filter the list according to a function
Definition bank.h:479
void setRows(int rows)
Definition bank.cpp:429
void putByte(const char *name, int index, int8_t value)
Definition bank.cpp:462
void reset()
Definition bank.cpp:437
void put(const char *name, int index, T value)
Definition bank.h:359
rowlist::list_t const & getRowList() const
Definition bank.cpp:484
void putFloat(const char *name, int index, float value)
Definition bank.cpp:467
bank(const schema &__schema, int __rows)
Definition bank.h:296
T get(int item, int index) const noexcept
Definition bank.h:321
rowlist & getMutableRowList()
Definition bank.cpp:492
int getInt(int item, int index) const noexcept
Definition bank.h:519
void putShort(const char *name, int index, int16_t value)
Definition bank.cpp:457
void notify() override
Definition bank.cpp:443
void putLong(const char *name, int index, int64_t value)
Definition bank.cpp:478
long getLong(int item, int index) const noexcept
Definition bank.h:511
void printValue(int schemaEntry, int row) const
print a stored value
Definition bank.cpp:530
int getRows() const noexcept
Definition bank.h:308
void put(int item, int index, T value)
Definition bank.h:369
std::size_t checksum(bool checkAllRows=false) const
calculate a checksum for this bank; useful for comparing two banks' equality
Definition bank.cpp:549
schema & getSchema()
Definition bank.h:306
void putDouble(const char *name, int index, double value)
Definition bank.cpp:472
T get(const char *name, int index) const noexcept
Definition bank.h:349
int getShort(int item, int index) const noexcept
Definition bank.h:551
void show() const override
show this bank's contents; only the rows in its current rowlist instance are shown
Definition bank.cpp:506
bank(const schema &__schema)
Definition bank.h:291
float getFloat(int item, int index) const noexcept
Definition bank.h:491
int getByte(int item, int index) const noexcept
Definition bank.h:563
rowlist::list_t const getFullRowList() const
Definition bank.cpp:488
void putInt(const char *name, int index, int32_t value)
Definition bank.cpp:452
double getDouble(int item, int index) const noexcept
Definition bank.h:499
rowlist::list_t const getRowListLinked(int const row, int const column) const
Definition bank.cpp:497
int getRows() const noexcept
Definition bank.h:191
int getInt(int element, int row) const noexcept
Definition bank.cpp:214
composite(const char *format)
Definition bank.h:181
virtual void notify()
Definition bank.cpp:282
int getEntries() const noexcept
Definition bank.h:193
composite(int group, int item, int size)
Definition bank.h:180
void print()
Definition bank.cpp:307
void putLong(int element, int row, int64_t value)
Definition bank.cpp:265
float getFloat(int element, int row) const noexcept
Definition bank.cpp:241
void putInt(int element, int row, int value)
Definition bank.cpp:251
int getEntryType(int index) const noexcept
Definition bank.h:194
void parse(std::string format)
Definition bank.cpp:160
void reset()
Definition bank.cpp:148
int getRowSize() const noexcept
Definition bank.h:197
int64_t getLong(int element, int row) const noexcept
Definition bank.cpp:231
void putFloat(int element, int row, float value)
Definition bank.cpp:273
virtual ~composite()
Definition bank.h:186
composite(int size)
Definition bank.h:179
composite()
Definition bank.h:178
void setRows(int rows)
Definition bank.cpp:164
int group()
Definition node.h:148
int item()
Definition node.h:149
int size() const noexcept
Definition node.h:92
int capacity() const noexcept
Definition node.h:98
int dataLength() const noexcept
Definition node.h:126
int type()
Definition node.h:150
bool allocate(int size)
Definition node.h:84
Schema definition for a HIPO bank.
Definition dictionary.h:56
int getEntryOrder(const char *name) const
Definition dictionary.h:146
std::string getEntryName(int item) const noexcept
Definition dictionary.h:130
int getOffset(int item, int order, int rows) const
Definition dictionary.h:109
int getEntryType(int item) const noexcept
Definition dictionary.h:119
float getFloatAt(int index) const noexcept
Definition bank.h:118
void initStructureBySize(int __group, int __item, int __type, int __size)
Definition bank.cpp:65
void putShortAt(int index, int16_t value)
Definition bank.h:134
int getItem() const
Definition bank.cpp:106
int getSize() const noexcept
Definition bank.h:81
void putIntAt(int index, int value)
Definition bank.h:130
int getDataSize() const noexcept
Definition bank.h:92
void putByteAt(int index, int8_t value)
Definition bank.h:138
std::vector< char > & getStructureBuffer()
Definition bank.h:66
bool allocate(int size)
Definition bank.cpp:58
int getGroup() const
Definition bank.cpp:101
virtual ~structure()=default
void putStringAt(int index, std::string &str)
Definition bank.cpp:135
structure()
Definition bank.h:74
int getStructureBufferSize()
Definition bank.h:67
void setSize(int size)
Definition bank.cpp:74
int16_t getShortAt(int index) const noexcept
Definition bank.h:112
virtual void show() const
Definition bank.cpp:120
int dataOffset
Definition bank.h:68
void putLongAt(int index, int64_t value)
Definition bank.h:150
long getLongAt(int index) const noexcept
Definition bank.h:124
int getType() const
Definition bank.cpp:96
void initNoCopy(const char *buffer, int size)
Definition bank.cpp:110
int8_t getByteAt(int index) const noexcept
Definition bank.h:115
int getIntAt(int index) const noexcept
Definition bank.h:108
structure(int size)
Definition bank.h:75
void setDataSize(int size)
Definition bank.cpp:80
void putDoubleAt(int index, double value)
Definition bank.h:146
virtual void notify()
Definition bank.h:156
void putFloatAt(int index, float value)
Definition bank.h:142
int getHeaderSize() const noexcept
Definition bank.h:87
void init(const char *buffer, int size)
Definition bank.cpp:114
double getDoubleAt(int index) const noexcept
Definition bank.h:121
std::string getStringAt(int index)
Definition bank.cpp:125
void setHeaderSize(int size)
Definition bank.cpp:89
const char * getAddress()
Definition bank.cpp:140
Definition progresstracker.hpp:16
HIPO namespace is used for the classes that read/write files and records.
Definition bank.cpp:45
@ kLong
Definition dictionary.h:41
@ kInt
Definition dictionary.h:38
@ kFloat
Definition dictionary.h:39
@ kShort
Definition dictionary.h:37
@ kByte
Definition dictionary.h:36
@ kDouble
Definition dictionary.h:40
constexpr uint32_t STRUCT_FORMAT_BYTE
Definition constants.h:130
banklist::size_type getBanklistIndex(banklist &banks, std::string const &bankName) noexcept(false)
Definition bank.cpp:585
constexpr int STRUCT_FORMAT_SHIFT
Definition constants.h:129
std::vector< bank > banklist
Definition bank.h:753
constexpr uint32_t STRUCT_SIZE_MASK
Definition constants.h:127