The implementation of multi-sign has a SigningAccounts array as a
member of the outermost object. This array could not be parsed
by the previous implementation of STParsedJSON, which only knew
how to parse objects. This refactor supports the required parsing.
The refactor divides the parsing into three separate functions:
o parseNoRecurse() which parses most rippled data types.
o parseObject() which parses object types that may contain
arbitrary other types.
o parseArray() which parses object types that may contain
arbitrary other types.
The change is required by the multi-sign implementation, but is
independent. So the parsing change is going in as a separate
commit.
The parsing is still far from perfect. But this was as much as
needs doing to accomplish the ends and mitigate risk of breaking
the parser.
* Limit HashPrefix construction and disallow assignment
* Give KnownFormats deleted copy members so that derived
classes will give the right answers if queried with the
std::is_copy_constructible/assignable traits.
* Replace SharedSingleton with a local static in
LedgerFormats::getInstance() to be consistent with
similar code in other places. This also allows the
LedgerFormats default constructor to be marked private
so that the compiler enforces the design that
LedgerFormats is a singleton type.
* Change return types of LedgerFormats::getInstance() and
TxFormats::getInstance() from pointer to non-const to
reference to const so as follow more established design
guidelines for singletons. This prevents pointers being
mistaken for heap-allocated objects, and the const
ensures the singleton isn't mutable.
* Change RippleAddress to inherit privately from
CBase58Data instead of publicly. This lets the compiler
enforce that there are no unintended conversions from
RippleAddress to CBase58Data. This change allows us
to remove a comment warning about unwanted conversions.