void CShaderParams<value_t>::SetMany(const CShaderParams& params) { SItems items; // set_union merges the two sorted lists into a new sorted list; // if two items are equivalent (i.e. equal names, possibly different values) // then the one from the first list is kept std::set_union( params.m_Items->items.begin(), params.m_Items->items.end(), m_Items->items.begin(), m_Items->items.end(), std::inserter(items.items, items.items.begin()), ItemNameCmp<value_t>()); items.RecalcHash(); m_Items = GetInterned(items); }
void CShaderParams<value_t>::Set(CStrIntern name, const value_t& value) { SItems items = *m_Items; typename SItems::Item addedItem = std::make_pair(name, value); // Add the new item in a way that preserves the sortedness and uniqueness of item names for (typename std::vector<typename SItems::Item>::iterator it = items.items.begin(); ; ++it) { if (it == items.items.end() || addedItem.first < it->first) { items.items.insert(it, addedItem); break; } else if (addedItem.first == it->first) { it->second = addedItem.second; break; } } items.RecalcHash(); m_Items = GetInterned(items); }
CShaderParams<value_t>::CShaderParams() { SItems items; items.RecalcHash(); m_Items = GetInterned(items); }
CShaderParams<value_t> CShaderParams<value_t>::CreateEmpty() { SItems items; items.RecalcHash(); return CShaderParams(GetInterned(items)); }