STPathSet* STPathSet::construct (SerializerIterator& s, SField::ref name) { std::vector<STPath> paths; std::vector<STPathElement> path; do { int iType = s.get8 (); if (iType == STPathElement::typeNone || iType == STPathElement::typeBoundary) { if (path.empty ()) { WriteLog (lsINFO, STBase) << "STPathSet: Empty path."; throw std::runtime_error ("empty path"); } paths.push_back (path); path.clear (); if (iType == STPathElement::typeNone) { return new STPathSet (name, paths); } } else if (iType & ~STPathElement::typeAll) { WriteLog (lsINFO, STBase) << "STPathSet: Bad path element: " << iType; throw std::runtime_error ("bad path element"); } else { auto hasAccount = iType & STPathElement::typeAccount; auto hasCurrency = iType & STPathElement::typeCurrency; auto hasIssuer = iType & STPathElement::typeIssuer; Account account; Currency currency; Account issuer; if (hasAccount) account.copyFrom (s.get160 ()); if (hasCurrency) currency.copyFrom (s.get160 ()); if (hasIssuer) issuer.copyFrom (s.get160 ()); path.emplace_back (account, currency, issuer, hasCurrency); } } while (1); }
STPathSet::STPathSet (SerialIter& sit, SField const& name) : STBase(name) { std::vector<STPathElement> path; for(;;) { int iType = sit.get8 (); if (iType == STPathElement::typeNone || iType == STPathElement::typeBoundary) { if (path.empty ()) { JLOG (debugLog().error()) << "Empty path in pathset"; Throw<std::runtime_error> ("empty path"); } push_back (path); path.clear (); if (iType == STPathElement::typeNone) return; } else if (iType & ~STPathElement::typeAll) { JLOG (debugLog().error()) << "Bad path element " << iType << " in pathset"; Throw<std::runtime_error> ("bad path element"); } else { auto hasAccount = iType & STPathElement::typeAccount; auto hasCurrency = iType & STPathElement::typeCurrency; auto hasIssuer = iType & STPathElement::typeIssuer; AccountID account; Currency currency; AccountID issuer; if (hasAccount) account.copyFrom (sit.get160 ()); if (hasCurrency) currency.copyFrom (sit.get160 ()); if (hasIssuer) issuer.copyFrom (sit.get160 ()); path.emplace_back (account, currency, issuer, hasCurrency); } } }