Beispiel #1
0
STObject::STObject (SOTemplate const& type,
        SerialIter & sit, SField const& name)
    : STBase (name)
{
    v_.reserve(type.size());
    set (sit);
    setType (type);
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
    }
}