rippled
Loading...
Searching...
No Matches
SOTemplate.cpp
1#include <xrpl/basics/contract.h>
2#include <xrpl/protocol/SField.h>
3#include <xrpl/protocol/SOTemplate.h>
4
5#include <cstddef>
6#include <initializer_list>
7#include <stdexcept>
8
9namespace ripple {
10
14 : indices_(SField::getNumFields() + 1, -1) // Unmapped indices == -1
15{
16 // Add all SOElements.
17 elements_.reserve(uniqueFields.size() + commonFields.size());
18 elements_.assign(uniqueFields);
19 elements_.insert(elements_.end(), commonFields);
20
21 // Validate and index elements_.
22 for (std::size_t i = 0; i < elements_.size(); ++i)
23 {
24 SField const& sField{elements_[i].sField()};
25
26 // Make sure the field's index is in range
27 //
28 if (sField.getNum() <= 0 || sField.getNum() >= indices_.size())
29 Throw<std::runtime_error>("Invalid field index for SOTemplate.");
30
31 // Make sure that this field hasn't already been assigned
32 //
33 if (getIndex(sField) != -1)
34 Throw<std::runtime_error>("Duplicate field index for SOTemplate.");
35
36 // Add the field to the index mapping table
37 //
38 indices_[sField.getNum()] = i;
39 }
40}
41
42int
43SOTemplate::getIndex(SField const& sField) const
44{
45 // The mapping table should be large enough for any possible field
46 //
47 if (sField.getNum() <= 0 || sField.getNum() >= indices_.size())
48 Throw<std::runtime_error>("Invalid field index for getIndex().");
49
50 return indices_[sField.getNum()];
51}
52
53} // namespace ripple
Identifies fields.
Definition SField.h:127
int getNum() const
Definition SField.h:248
std::vector< SOElement > elements_
Definition SOTemplate.h:153
std::vector< int > indices_
Definition SOTemplate.h:154
int getIndex(SField const &) const
Retrieve the position of a named field.
SOTemplate(SOTemplate &&other)=default
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6