bool STObject::setType (const SOTemplate& type) { bool valid = true; mType = &type; decltype(v_) v; v.reserve(type.size()); for (auto const& e : type.all()) { auto const iter = std::find_if( v_.begin(), v_.end(), [&](detail::STVar const& b) { return b.get().getFName() == e->e_field; }); if (iter != v_.end()) { if ((e->flags == SOE_DEFAULT) && iter->get().isDefault()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << " ) invalid default " << e->e_field.fieldName; valid = false; } v.emplace_back(std::move(*iter)); v_.erase(iter); } else { if (e->flags == SOE_REQUIRED) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << " ) invalid missing " << e->e_field.fieldName; valid = false; } v.emplace_back(detail::nonPresentObject, e->e_field); } } for (auto const& e : v_) { // Anything left over in the object must be discardable if (! e->getFName().isDiscardable()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << " ) invalid leftover " << e->getFName ().getName (); valid = false; } } // Swap the template matching data in for the old data, // freeing any leftover junk v_.swap(v); return valid; }
void STObject::set (const SOTemplate& type) { v_.clear(); v_.reserve(type.size()); mType = &type; for (auto const& elem : type.all()) { if (elem->flags != SOE_REQUIRED) v_.emplace_back(detail::nonPresentObject, elem->e_field); else v_.emplace_back(detail::defaultObject, elem->e_field); } }