// -------------------- template template int AMap::FindAdd_(KK&& k) { return key.FindAdd(std::forward(k), [&] { value.Add(); }); } template template int AMap::FindAdd_(KK&& k, TT&& x) { return key.FindAdd(std::forward(k), [&] { value.Add(std::forward(x)); }); } template template T& AMap::Put_(KK&& k) { int i = key.Put(std::forward(k)); if(i < value.GetCount()) { Destroy(&value[i], &value[i] + 1); Construct(&value[i], &value[i] + 1); return value[i]; } else { ASSERT(i == value.GetCount()); return value.Add(); } } template template int AMap::Put_(KK&& k, TT&& x) { int i = key.Put(std::forward(k)); if(i < value.GetCount()) value[i] = std::forward(x); else { ASSERT(i == value.GetCount()); value.Add(std::forward(x)); } return i; } template template int AMap::PutDefault_(KK&& k) { int i = key.Put(std::forward(k)); if(i >= value.GetCount()) { ASSERT(i == value.GetCount()); value.Add(); } else { Destroy(&value[i], &value[i] + 1); Construct(&value[i], &value[i] + 1); } return i; } template template int AMap::FindPut_(KK&& k) { int i = key.FindPut(std::forward(k)); if(i >= value.GetCount()) value.Add(); return i; } template template int AMap::FindPut_(KK&& k, TT&& init) { int i = key.FindPut(std::forward(k)); if(i >= value.GetCount()) value.Add(std::forward(init)); return i; } template template T& AMap::GetAdd_(KK&& k) { return value[FindAdd(std::forward(k))]; } template template T& AMap::GetAdd_(KK&& k, TT&& x) { return value[FindAdd(std::forward(k), std::forward(x))]; } template template T& AMap::GetPut_(KK&& k) { int i = key.FindPut(std::forward(k)); return i < value.GetCount() ? value[i] : value.Add(); } template template T& AMap::GetPut_(KK&& k, TT&& x) { bool put = false; int i = key.FindPut(std::forward(k), put); if(i < value.GetCount()) { if(put) value[i] = std::forward(x); return value[i]; } return value.Add(std::forward(x)); } template void AMap::Serialize(Stream& s) { int version = 0; s / version % key % value; if(key.GetCount() != value.GetCount()) { Clear(); s.LoadError(); } } template void AMap::Xmlize(XmlIO& xio) { XmlizeMap >(xio, "key", "value", *this); } template void AMap::Jsonize(JsonIO& jio) { JsonizeMap, K, T>(jio, *this, "key", "value"); } template String AMap::ToString() const { String r; r = "{"; for(int i = 0; i < GetCount(); i++) { if(i) r << ", "; if(IsUnlinked(i)) r << "UNLINKED "; r << GetKey(i) << ": " << (*this)[i]; } r << '}'; return r; } template int AMap::RemoveKey(const K& k) { Vector rk; int q = Find(k); while(q >= 0) { rk.Add(q); q = FindNext(q); } Remove(rk); return rk.GetCount(); } template void AMap::Sweep() { value.RemoveIf([&](int i) { return key.IsUnlinked(i); }); key.Sweep(); } #ifdef UPP template void FixedAMap::Serialize(Stream& s) { s % key % value; if(key.GetCount() != value.GetCount()) s.LoadError(); } template void FixedAMap::Xmlize(XmlIO& xio) { XmlizeSortedMap >(xio, "key", "value", *this); } template void FixedAMap::Jsonize(JsonIO& jio) { JsonizeSortedMap, K, T>(jio, *this, "key", "value"); } template String FixedAMap::ToString() const { String r; r = "{"; for(int i = 0; i < GetCount(); i++) { if(i) r << ", "; r << GetKey(i) << ": " << (*this)[i]; } r << '}'; return r; } #endif