MeshTools: stop using std::unordered_multimap in concatenate().
Let's guess what would be faster -- making a ton of tiny allocations,
hashing a bunch of numbers in a very complex way and then jumping
through all those indirections and cache misses of a multimap linked
list for each and every attribute of each mesh, OR going linearly
through a two tiny arrays for every mesh? I don't have any benchmarks
ready but I bet the latter will win.
assertPrefix<<"expected"<<out.attributeFormat(dst)<<"for attribute"<<dst<<"("<<Debug::nospace<<out.attributeName(dst)<<Debug::nospace<<") but got"<<mesh.attributeFormat(src)<<"in mesh"<<i<<"attribute"<<src,
assertPrefix<<"expected"<<out.attributeFormat(*dst)<<"for attribute"<<dst<<"("<<Debug::nospace<<out.attributeName(*dst)<<Debug::nospace<<") but got"<<mesh.attributeFormat(src)<<"in mesh"<<i<<"attribute"<<src,
assertPrefix<<"attribute"<<dst<<"("<<Debug::nospace<<out.attributeName(dst)<<Debug::nospace<<")"<<(out.attributeArraySize(dst)?"is":"isn't")<<"an array but attribute"<<src<<"in mesh"<<i<<(mesh.attributeArraySize(src)?"is":"isn't"),
assertPrefix<<"attribute"<<dst<<"("<<Debug::nospace<<out.attributeName(*dst)<<Debug::nospace<<")"<<(out.attributeArraySize(*dst)?"is":"isn't")<<"an array but attribute"<<src<<"in mesh"<<i<<(mesh.attributeArraySize(src)?"is":"isn't"),
assertPrefix<<"expected array size"<<out.attributeArraySize(dst)<<"or less for attribute"<<dst<<"("<<Debug::nospace<<out.attributeName(dst)<<Debug::nospace<<") but got"<<mesh.attributeArraySize(src)<<"in mesh"<<i<<"attribute"<<src,
assertPrefix<<"expected array size"<<out.attributeArraySize(*dst)<<"or less for attribute"<<dst<<"("<<Debug::nospace<<out.attributeName(*dst)<<Debug::nospace<<") but got"<<mesh.attributeArraySize(src)<<"in mesh"<<i<<"attribute"<<src,