Examples
The main function in ViennaData is the access() function. From a user perspective, it returns a reference to the data identified by a key and stored for an arbitrary object. Two template arguments have to be specified: The first argument denotes the key type, while the second argument denotes the data type. Two pairs of parentheses have to be provided: The first provides the key object, the second denotes the object the data is associated with. Consider the following code:
SomeClass obj1; SomeClass obj2; // // Store a bit of data on obj1 // //using key of type char, data of type double viennadata::access<char, double>('c')(obj1) = 3.1415; //using key of type char, data of type std::string viennadata::access<char, std::string>('c')(obj1) = "Hello"; //using key of type std::string, data of type char viennadata::access<std::string, char>("some_character")(obj1) = 'a'; // // Store a bit of data on obj2 // //using key of type long, data of type long viennadata::access<long, long>(42)(obj2) = 360; //using key of type double, data of type std::string viennadata::access<double, std::string>(3.1415)(obj2) = "World"; //using key of type std::string, data of type char viennadata::access<std::string, char>("some_character")(obj2) = '!';
Two objects of arbitrary type (here SomeClass) are created and some data is associated with them. Then, at any other place in the application, one can easily access the data:
//output the stored data std::cout << "--- Data for obj1 ---" << std::endl; std::cout << "Data (type 'double') for key 'c' (type 'char'): " << viennadata::access<char, double>('c')(obj1) << std::endl; std::cout << "Data (type 'std::string') for key 'c' (type 'char'): " << viennadata::access<char, std::string>('c')(obj1) << std::endl; std::cout << "Data (type 'char') for key 'some_character' (type 'std::string'): " << viennadata::access<std::string, char>("some_character")(obj1) << std::endl; std::cout << "--- Data for obj2 ---" << std::endl; std::cout << "Data (type 'long') for key '42' (type 'long'): " << viennadata::access<long, long>(42)(obj2) << std::endl; std::cout << "Data (type 'std::string') for key '3.1415' (type 'double'): " << viennadata::access<double, std::string>(3.1415)(obj2) << std::endl; std::cout << "Data (type 'char') for key 'some_character' (type 'std::string'): " << viennadata::access<std::string, char>("some_character")(obj2) << std::endl;
In a similar manner, data can be moved, copied and erased. Fore more details, please consult the documentation.