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);
310 if (
this != &other) {
322 int getRows() const noexcept{
return bankRows;}
324 int getInt(
int item,
int index)
const noexcept;
325 int getShort(
int item,
int index)
const noexcept;
326 int getByte(
int item,
int index)
const noexcept;
327 float getFloat(
int item,
int index)
const noexcept;
328 double getDouble(
int item,
int index)
const noexcept;
329 long getLong(
int item,
int index)
const noexcept;
331 std::vector<int>
getInt(
int item)
const noexcept;
332 std::vector<float>
getFloat(
int item)
const noexcept;
333 std::vector<double>
getDouble(
int item)
const noexcept;
335 template<
typename T =
double> T
get(
int item,
int index)
const noexcept {
336 auto type = bankSchema.getEntryType(item);
337 auto offset = bankSchema.getOffset(item, index, bankRows);
346 printf(
"---> error(get) : unknown type for [%s] type = %d\n", bankSchema.getEntryName(item).c_str(), type);
351 int getInt(
const char *name,
int index)
const noexcept;
353 int getShort(
const char *name,
int index)
const noexcept;
354 int getByte(
const char *name,
int index)
const noexcept;
355 float getFloat(
const char *name,
int index)
const noexcept;
356 double getDouble(
const char *name,
int index)
const noexcept;
357 long getLong(
const char *name,
int index)
const noexcept;
359 std::vector<int>
getInt(
const char *name)
const noexcept;
360 std::vector<float>
getFloat(
const char *name)
const noexcept;
361 std::vector<double>
getDouble(
const char *name)
const noexcept;
363 template<
typename T =
double> T
get(
const char *name,
int index)
const noexcept {
364 return get<T>(bankSchema.getEntryOrder(name), index);
373 template<
typename T>
void put(
const char *name,
int index,
T value) {
374 put(bankSchema.getEntryOrder(name), index,
value);
383 template<
typename T>
void put(
int item,
int index,
T value) {
384 auto type = bankSchema.getEntryType(item);
393 printf(
"---> error(put) : unknown type for [%s] type = %d\n", bankSchema.getEntryName(item).c_str(), type);
415 void show()
const override;
444 struct sealed_bank :
bank {
445 sealed_bank(sealed_bank
const&) =
delete;
446 sealed_bank(sealed_bank&&) =
delete;
453 template <
typename Sig>
struct sig_first_param;
454 template <
typename R,
typename A0,
typename... As>
455 struct sig_first_param<R(A0, As...)> {
using type = A0; };
456 template <
typename R,
typename A0,
typename... As>
457 struct sig_first_param<R(*)(A0, As...)> {
using type = A0; };
458 template <
typename C,
typename R,
typename A0,
typename... As>
459 struct sig_first_param<R(C::*)(A0, As...)> {
using type = A0; };
460 template <
typename C,
typename R,
typename A0,
typename... As>
461 struct sig_first_param<R(C::*)(A0, As...) const> {
using type = A0; };
465 template <
typename F,
typename =
void>
struct call_signature {
using type = F; };
466 template <
typename F>
467 struct call_signature<F, std::void_t<decltype(&F::operator())>> {
using type =
decltype(&F::operator()); };
470 template <
typename F>
471 using bank_param_t =
typename sig_first_param<typename call_signature<F>::type>::type;
475 template <
typename F,
typename =
void>
476 struct bank_takes_bank_by_ref
477 : std::bool_constant<std::is_invocable_r<bool, F&, sealed_bank&, int>::value> {};
482 template <
typename F>
483 struct bank_takes_bank_by_ref<F, std::void_t<bank_param_t<F>>>
484 : std::is_lvalue_reference<bank_param_t<F>> {};
486 template <
typename F>
487 inline constexpr bool bank_takes_bank_by_ref_v = bank_takes_bank_by_ref<std::decay_t<F>>::value;
492 template <
typename F, std::enable_if_t<std::is_invocable_r_v<
bool, F&, bank&,
int>,
int>>
494 static_assert(detail::bank_takes_bank_by_ref_v<F>,
495 "hipo::bank::rowlist::filter: the callable's bank parameter must be an lvalue reference "
496 "(bank& / bank const& / auto& / auto const&), never by value -- a by-value bank is copied "
497 "per row and the copy shallow-aliases the original's buffer, which can cause a data race "
498 "under multithreaded RDataFrame use.");
499 filterByFunction(std::forward<F>(
func));
507 int offset = bankSchema.
getOffset(item, index, bankRows);
515 int offset = bankSchema.
getOffset(item, index, bankRows);
519 int offset = bankSchema.
getOffset(item, index, bankRows);
527 int offset = bankSchema.
getOffset(item, index, bankRows);
535 int offset = bankSchema.
getOffset(item, index, bankRows);
540 default:
printf(
"---> error : requested INT for [%s] type = %d\n",
549 std::vector<int>
row;
553 int offset = bankSchema.
getOffset(item,
j, bankRows);
558 default:
printf(
"---> error : requested INT for [%s] type = %d\n",
567 int offset = bankSchema.
getOffset(item, index, bankRows);
571 default:
printf(
"---> error : requested SHORT for [%s] type = %d\n",
579 int offset = bankSchema.
getOffset(item, index, bankRows);
582 default:
printf(
"---> error : requested BYTE for [%s] type = %d\n",
590 int offset = bankSchema.
getOffset(item, index, bankRows);
595 default:
printf(
"---> error : requested INT for [%s] type = %d\n",name,type);
break;
603 std::vector<int>
row;
607 int offset = bankSchema.
getOffset(item,
j, bankRows);
612 default:
printf(
"---> error : requested INT for [%s] type = %d\n",name,type);
break;
621 int offset = bankSchema.
getOffset(item, index, bankRows);
625 default:
printf(
"---> error : requested SHORT for [%s] type = %d\n",
633 int offset = bankSchema.
getOffset(item, index, bankRows);
636 default:
printf(
"---> error : requested BYTE for [%s] type = %d\n",
645 int offset = bankSchema.
getOffset(item, index, bankRows);
653 std::vector<float>
row;
657 int offset = bankSchema.
getOffset(item,
j, bankRows);
665 std::vector<float>
row;
669 int offset = bankSchema.
getOffset(item,
j, bankRows);
678 int offset = bankSchema.
getOffset(item, index, bankRows);
682 int offset = bankSchema.
getOffset(item, index, bankRows);
689 std::vector<double>
row;
694 int offset = bankSchema.
getOffset(item,
j, bankRows);
700 int offset = bankSchema.
getOffset(item,
j, bankRows);
708 std::vector<double>
row;
714 int offset = bankSchema.
getOffset(item,
j, bankRows);
720 int offset = bankSchema.
getOffset(item,
j, bankRows);
730 int offset = bankSchema.
getOffset(item, index, bankRows);
737 int offset = bankSchema.
getOffset(item, index, bankRows);
742 int offset = bankSchema.
getOffset(item, index, bankRows);
747 int offset = bankSchema.
getOffset(item, index, bankRows);
752 int offset = bankSchema.
getOffset(item, index, bankRows);
758 int offset = bankSchema.
getOffset(item, index, bankRows);
763 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:493
void setRows(int rows)
Definition bank.cpp:429
void putByte(const char *name, int index, int8_t value)
Definition bank.cpp:462
schema copySchema() const
Definition bank.h:320
void reset()
Definition bank.cpp:437
void put(const char *name, int index, T value)
Definition bank.h:373
bank & operator=(const bank &other)
Definition bank.h:309
bank(const bank &other)
Definition bank.h:304
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:335
rowlist & getMutableRowList()
Definition bank.cpp:492
int getInt(int item, int index) const noexcept
Definition bank.h:533
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:525
void printValue(int schemaEntry, int row) const
print a stored value
Definition bank.cpp:530
int getRows() const noexcept
Definition bank.h:322
void put(int item, int index, T value)
Definition bank.h:383
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:319
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:363
int getShort(int item, int index) const noexcept
Definition bank.h:565
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:505
int getByte(int item, int index) const noexcept
Definition bank.h:577
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:513
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:767
constexpr uint32_t STRUCT_SIZE_MASK
Definition constants.h:127