#include #include #include #include #include #include namespace xrpl { SOTemplate::SOTemplate( std::initializer_list uniqueFields, std::initializer_list commonFields) : indices_(SField::getNumFields() + 1, -1) // Unmapped indices == -1 { // Add all SOElements. elements_.reserve(uniqueFields.size() + commonFields.size()); elements_.assign(uniqueFields); elements_.insert(elements_.end(), commonFields); // Validate and index elements_. for (std::size_t i = 0; i < elements_.size(); ++i) { SField const& sField{elements_[i].sField()}; // Make sure the field's index is in range // if (sField.getNum() <= 0 || sField.getNum() >= indices_.size()) Throw("Invalid field index for SOTemplate."); // Make sure that this field hasn't already been assigned // if (getIndex(sField) != -1) Throw("Duplicate field index for SOTemplate."); // Add the field to the index mapping table // indices_[sField.getNum()] = i; } } int SOTemplate::getIndex(SField const& sField) const { // The mapping table should be large enough for any possible field // if (sField.getNum() <= 0 || sField.getNum() >= indices_.size()) Throw("Invalid field index for getIndex()."); return indices_[sField.getNum()]; } } // namespace xrpl