diff --git a/src/lib/idi/genfunc.cpp b/src/lib/idi/genfunc.cpp index bfcf7415f..36811bf8e 100644 --- a/src/lib/idi/genfunc.cpp +++ b/src/lib/idi/genfunc.cpp @@ -48,9 +48,11 @@ namespace idi { demangled_innermost_component (const char* rawName) { string typeStr = demangleCxx (rawName); - size_t pos = typeStr.rfind("::"); + size_t end = typeStr.rfind("<"); + size_t pos = typeStr.rfind("::", end); if (pos != string::npos) - typeStr = typeStr.substr(pos+2); + typeStr = (end==string::npos? typeStr.substr(pos+2) + : typeStr.substr(pos+2, end-pos-2)); return typeStr; } diff --git a/src/lib/idi/genfunc.hpp b/src/lib/idi/genfunc.hpp index 45cc4f434..5728ac4ed 100644 --- a/src/lib/idi/genfunc.hpp +++ b/src/lib/idi/genfunc.hpp @@ -33,6 +33,9 @@ ** - render an ID in human readable form ** - derive a hash function ** + ** @todo better unit test coverage + ** @todo improve implementation of typeFullID + ** @see GenericIdFunction_test ** @see EntryID ** */ @@ -105,7 +108,7 @@ namespace idi { } - /** build a per-type unique identifier. + /** build a per-type identifier, with type prefix and running counter. * @return a type based prefix, followed by an instance number * @note we use the short prefix without namespace, not necessarily unique * @todo consequently the generated IDs might clash for two distinct types, diff --git a/tests/15library.tests b/tests/15library.tests index 77b887245..1c325ca73 100644 --- a/tests/15library.tests +++ b/tests/15library.tests @@ -209,6 +209,11 @@ return: 0 END +TEST "Generic ID generation" GenericIdFunction_test < + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +#include "lib/test/run.hpp" +//#include "lib/test/test-helper.hpp" +#include "lib/idi/genfunc.hpp" + +//#include +//#include +//#include +#include + +//using std::string; +//using std::vector; +using std::cout; +using std::endl; +//using std::swap; + + +namespace lib { +namespace idi { +namespace test{ + +// using lumiera::error::LUMIERA_ERROR_LOGIC; + + namespace {//Test fixture.... + + class Thing + { }; + + template + struct Some + { + X x; + }; + + typedef Some SomeThing; + + }//(End)Test fixture + + + + + + + + + + /**************************************************************************//** + * @test cover a standard scheme to generate type and instance identifiers. + * + * @see EntryID + * @see StructFactory + */ + class GenericIdFunction_test : public Test + { + + virtual void + run (Arg) + { + simpleUsage(); + verify_typeSymbol(); + verify_fullTypeID(); + verify_prefix(); + verify_typeHash(); + verify_symbolicInstanceID(); + } + + + void + simpleUsage() + { + CHECK ("int" == typeSymbol()); + CHECK ("bool" == typeSymbol()); + + CHECK ("Some" == categoryFolder()); + } + + + void + verify_typeSymbol() + { + } + + + void + verify_fullTypeID() + { + //////TODO this should be a identifier with only letters, numbers and underscores. Need to extend the util::sanitise + CHECK("lib::idi::test::(anonymous_namespace)::Somelib::idi::test::(anonymous_namespace)::Thing" == typeFullID()); + } + + + void + verify_prefix() + { + } + + + void + verify_typeHash() + { + } + + + void + verify_symbolicInstanceID() + { + class Unique { }; + + CHECK ("Unique.001" == generateSymbolicID()); + CHECK ("Unique.002" == generateSymbolicID()); + CHECK ("Unique.003" == generateSymbolicID()); + } + }; + + + /** Register this test class... */ + LAUNCHER (GenericIdFunction_test, "unit common"); + + + +}}} // namespace lib::idi::test