#include "Rad/Loader.h" // For load/save by pointer: RD_LoaderSingleton<BaseClass>* RD_LoaderSingleton<BaseClass>::_instance = NULL;
void RD_AddToLoader(const BaseClass& base) { RD_LoaderSingleton<BaseClass>::instance().append(base); }
If this is all done for DistanceBase, an example of its use is:
// Configure loader RD_AddToLoader(L1Distance()); RD_AddToLoader(L2Distance()); DistanceBase d_ptr1 = new L1Distance(); // Save by pointer: RD_Bfstream bfs("data.out",ios::out); bfs<<d_ptr1; bfs.close(); // Load by pointer: DistanceBase d_ptr2 = NULL; bfs.open("data.out",ios::in); bfs>>d_ptr2; // Invokes RD_LoaderSingleton bfs.close(); // d_ptr2 now points to a new L1Distance object
We can then define load/save methods for NearestNeighbour:
void NearestNeighbour::save(RD_Bfstream& bfs) const { bfs<<versionNo(); bfs<<_d; // Save by pointer } void NearestNeighbour::load(RD_Bfstream& bfs) { delete _d; _d=NULL; // Zap current distance short v; bfs>>v; switch (v) { case (1): bfs>>_d; // Load by pointer break; default: cerr<<"Unexpected version number "<<v<<endl; abort(); } }