HashMap with BaseArray as value
-
With R20 I had no problem using a
HashMap
with aBaseArray<Int32>
as value. All compiling fine, and working as expected.
Porting that implementation to R19 (for users having not upgraded to R20), I encounter a compiler error, mentioning that the operator= cannot be accessed, since private.
Obviously, I had to replace the R20HashMap::Insert
for an R19HashMap::Put
and there seems to lie the problem// key is an integer and value an array of integers maxon::HashMap<Int32, maxon::BaseArray<Int32>> dataKeyValue; const Int32 key = 1; maxon::HashMap<Int32, maxon::BaseArray<Int32>>::Entry* e = dataKeyValue.FindEntry(key); if (e) { maxon::BaseArray<Int32>& values = e->GetValue(); // ... } else { maxon::BaseArray<Int32> newValues; // ... dataKeyValue.Put(key, newValues); }
The compiler error:
error C2248: 'maxon::BaseArray<Bool,16,maxon::BASEARRAYFLAGS_0,maxon::DefaultAllocator>::operator =': cannot access private member declared in class 'maxon::BaseArray<Bool,16,maxon::BASEARRAYFLAGS_0,maxon::DefaultAllocator>'
Any hint what I could do in order to have the same functionality compiled in R19?
Thanks in advance. -
Hi Daniel, thanks for reaching out us.
With regard to your question, the old
HashMap::Put
implementation does only support types which have a copy-assignment operator. But there’s theFindOrCreateEntry
function which inserts an entry and default-initializes the value, then the value can be set later.maxon::Bool created = false; maxon::HashMap<Int32, maxon::BaseArray<Int32>>::Entry* e = dataKeyValue.FindOrCreateEntry(key, created); if (!e) // error handling if (created) { maxon::BaseArray<Int32> newValues; // ... e->SetValue(std::move(newValues)); }
Let me know if it does work as expected.
Cheers, Riccardo
-
@r_gigante
Thanks for the headsup aboutFindOrCreateEntry
.
SincePut
does use that method internally, I didn't even consider about trying to use it, as I simply assumed it would have the same issue. Guess I was wrong about not trying it.Problem solved.