start brainstorming on #279 (extensible ID)

This commit is contained in:
Fischlurch 2009-10-02 01:52:59 +02:00
parent 8136b0a4b8
commit 455ee34344
4 changed files with 200 additions and 0 deletions

67
src/lib/sub-id.hpp Normal file
View file

@ -0,0 +1,67 @@
/*
SUB-ID.hpp - extensible symbolic identifier
Copyright (C) Lumiera.org
2009, Hermann Vosseler <Ichthyostega@web.de>
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.
*/
/** @file sub-id.hpp
** Extensible symbolic ID type.
** @todo (9/09) WIP-WIP-WIP just some vague emerging ideas here...
**
** My observation is that, during design, I did run again and again into a specific
** situation, which I then needed to circumvent due to a lacking primary solution.
** Learning from that experiences, I start building this structured ID template.
** - it shall be an \em symbolic identifier, not an artificial ID
** - the basic value set should be limited and statically type safe.
** - possibility of structured adornments and variations
** - optionally concealing these extensions from the interface level
**
** @see SubID_test
** @see MultiFact
**
*/
#ifndef LIB_SUB_ID_H
#define LIB_SUB_ID_H
//#include <functional>
namespace lib {
/**
*
*/
template<typename I>
struct SubID
{
};
} // namespace lib
#endif

View file

@ -863,6 +863,11 @@ return: 0
END
PLANNED "extensible symbolic identifier" SubID_test <<END
return: 0
END
TEST "VectorTransfer_test" VectorTransfer_test <<END
return: 0
END

View file

@ -87,6 +87,7 @@ test_lib_SOURCES = \
$(testlib_srcdir)/test/test-helper-test.cpp \
$(testlib_srcdir)/typed-allocation-manager-test.cpp \
$(testlib_srcdir)/typed-counter-test.cpp \
$(testlib_srcdir)/sub-id-test.cpp \
$(testlib_srcdir)/vectortransfertest.cpp \
$(testlib_srcdir)/visitingtoolconcept.cpp \
$(testlib_srcdir)/visitingtoolextendedtest.cpp \

127
tests/lib/sub-id-test.cpp Normal file
View file

@ -0,0 +1,127 @@
/*
SubID(Test) - exploring possible properties of an extensible symbolic identifier
Copyright (C) Lumiera.org
2009, Hermann Vosseler <Ichthyostega@web.de>
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/sub-id.hpp"
#include <boost/functional/hash.hpp>
#include <tr1/unordered_map>
#include <tr1/functional>
#include <vector>
#include <string>
namespace lib {
namespace test{
// using std::tr1::function;
using std::tr1::bind;
using std::tr1::placeholders::_1;
using boost::hash;
using std::vector;
using std::string;
namespace { // test data
}
/****************************************************************************
* @test for now (9/09) this is a playground for shaping a vague design idea
* - base types and casts
* - exploring some extensions
* - use this ID as Hash-Map key
*
* @see lib::SubID
*/
class SubID_test : public Test
{
virtual void
run (Arg)
{
UNIMPLEMENTED ("SubID brainstorming");
checkBaseType();
checkExtension();
// buildHashtable<ID_A> (buildIDs<ID_A>() );
// buildHashtable<ID_B> (buildIDs<ID_B>() );
}
void
checkBaseType ()
{
}
void
checkExtension ()
{
}
template<class KEY>
struct HashTable
: std::tr1::unordered_map<KEY, string, hash<KEY> >
{
void
add (KEY key)
{
*this[key] = string(key);
}
void
verify (KEY key)
{
ASSERT (string(key) == *this[key]);
}
};
template<class KEY>
void
buildHashtable (vector<KEY> keys)
{
typedef HashTable<KEY> HTab;
HTab tab;
for_each (keys, bind (&HTab::add, tab, _1 ));
for_each (keys, bind (&HTab::verify, tab, _1 ));
}
};
/** Register this test class... */
LAUNCHER (SubID_test, "unit common");
}} // namespace lib::test