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