New features: Heterogeneous Assign

The semantics of the method Assign() has been changed in comparison to TCollection. In NCollection classes the method Assign() is virtual and it receives the object of the abstract BaseCollection class (see the previous section). Therefore this method can be used to assign any collection type to any other if only these collections are instantiated on the same ItemType.

For example, conversion of Map into Array1 is performed like this:

#include <NCollection_Map.hxx>

#include <NCollection_Array1.hxx>

typedef NCollection_Map<gp_Pnt> MyPackage_MapOfPnt;

typedef NCollection_Array1<gp_Pnt> MyPackage_Array1OfPnt;

....

MyPackage_MapOfPnt aMapPnt;

....

MyPackage_Array1OfPnt anArr1Pnt (1, aMapPnt.Size());

anArr1Pnt.Assign (aMapPnt); // heterogeneous assignment

There are some aspects to mention:

- Unlike in TCollection, in NCollection the methods Assign and operator= do not coincide. The former is a virtual method defined in the BaseCollection class. The latter is always defined in instance classes as a non-virtual inline method and it corresponds exactly to the method Assign in TCollection classes. Therefore it is always profitable to use operator= instead of Assign wherever the types on both sides of assignment are known.

- If the method Assign copies to Array1or Array2 structure, it first checks if the size of the array is equal to the number of items in the copied collection object. If the sizes differ, an exception is thrown, as in TCollection_Array1.gxx

- Copying to Map, IndexedMap, DataMap and IndexedDataMap can bring about a loss of data: when two or more copied data items have the same key value, only one item is copied and the others are discarded. It can lead to an error in the code like the following:

MyPackage_Array1OfPnt anArr1Pnt (1, 100);

MyPackage_MapOfPnt aMapPnt;

....

aMapPnt.Assign(anArr1Pnt);

anArr1Pnt.Assign(aMapPnt);

Objects of classes parameterised with two types (DoubleMap, DataMap and IndexedDataMap) cannot be assigned. Their method Assign throws the exception Standard_TypeMismatch (because it is impossible to check if the passed BaseCollection parameter belongs to the same collection type).