GenNode(#956): define the ctors

implies decision on the ID representation
This commit is contained in:
Fischlurch 2015-07-03 04:13:16 +02:00
parent 1082196906
commit f15266e435
4 changed files with 99 additions and 14 deletions

View file

@ -101,6 +101,7 @@
#include "lib/variant.hpp"
#include "lib/time/timevalue.hpp"
#include "lib/diff/record.hpp"
#include "lib/idi/entry-id.hpp"
//#include "lib/util.hpp"
//#include "lib/format-string.hpp"
@ -148,13 +149,88 @@ namespace diff{
DataCap(X&& x)
: Variant<DataValues>(std::forward<X>(x))
{ }
DataCap(DataCap const& o) =default;
DataCap(DataCap&& o) =default;
DataCap(DataCap& o)
: DataCap((DataCap const&)o)
{ }
};
/** generic data element node within a tree */
class GenNode
struct GenNode
{
public:
class ID
: public idi::BareEntryID
{
friend class GenNode;
template<typename X>
ID (X*, string const& symbolicID)
: idi::BareEntryID (symbolicID,
idi::getTypeHash<X>())
{ }
public:
ID (GenNode const& node)
: ID(node.idi)
{ }
// standard copy operations acceptable
};
ID idi;
DataCap data;
template<typename X>
GenNode(X&& val)
: idi(&val, buildChildID<X>())
, data(std::forward<X>(val))
{ }
template<typename X>
GenNode(string const& symbolicID, X&& val)
: idi(&val, symbolicID)
, data(std::forward<X>(val))
{ }
GenNode(string const& symbolicID, const char* text)
: GenNode(symbolicID, string(text))
{ }
GenNode(const char* text)
: GenNode(string(text))
{ }
GenNode(GenNode const& o) =default;
GenNode(GenNode&& o) =default;
GenNode(GenNode& o)
: GenNode((GenNode const&)o)
{ }
// default copy assignable
bool
isNamed() const
{
return util::startsWith (idi.getSym(), "_CHILD_");
}
friend string
name (GenNode const& node)
{
return node.idi.getSym();
}
private:
template<typename X>
static string
buildChildID()
{
return "_CHILD_" + idi::generateSymbolicID<X>();
}
};
@ -186,21 +262,21 @@ namespace diff{
inline GenNode
Rec::buildTypeAttribute (string const& typeID)
{
return GenNode(); ///TODO
return GenNode("type", typeID);
}
template<>
inline string
Rec::extractKey (GenNode const& v)
{
return "todo"; ////TODO
return v.idi.getSym();
}
template<>
inline GenNode
Rec::extractVal (GenNode const& v)
{
return GenNode(); ///TODO
return GenNode(v); ///TODO
}

View file

@ -111,6 +111,12 @@ namespace lib {
using Type = X;
};
template<typename X, typename TYPES>
struct CanBuildFrom<const X, Node<X, TYPES>>
{
using Type = X;
};
template<typename X, typename T,typename TYPES>
struct CanBuildFrom<X, Node<T, TYPES>>
{

View file

@ -33,7 +33,9 @@
//#include <vector>
#include <cmath>
using util::isnil;
using util::contains;
using util::isSameObject;
using lib::time::Time;
using lib::time::TimeSpan;
//using std::string;
@ -93,7 +95,6 @@ namespace test{
objectShortcut();
symbolReference();
sequenceIteration();
duplicateDetection();
copy_and_move();
}
@ -110,7 +111,7 @@ namespace test{
// can optionally be named
GenNode n2("π", 3.14159265358979323846264338328);
CHECK (fabs (3.14159265 - n2.data.get<double>) < 1e-5 );
CHECK (fabs (3.14159265 - n2.data.get<double>()) < 1e-5 );
CHECK (n2.isNamed());
CHECK ("π" == n2.idi.getSym());
CHECK ("π" == name(n2));
@ -255,18 +256,14 @@ namespace test{
void
sequenceIteration()
{
}
void
duplicateDetection()
{
UNIMPLEMENTED ("wtf");
}
void
copy_and_move()
{
UNIMPLEMENTED ("need to check that?");
}
};

View file

@ -35,7 +35,13 @@
<node CREATED="1435421670349" ID="ID_1358247529" MODIFIED="1435421676200" TEXT="verwende EntryID">
<node CREATED="1435421678004" ID="ID_691179282" MODIFIED="1435421687224" TEXT="Abh&#xe4;ngigkeitsprobleme">
<node CREATED="1435421693260" ID="ID_1314021887" MODIFIED="1435421708857" TEXT="generische ID-Funktionen"/>
<node CREATED="1435421739988" ID="ID_405602814" MODIFIED="1435421749352" TEXT="EntryID geh&#xf6;rt in Library"/>
<node CREATED="1435421739988" ID="ID_405602814" MODIFIED="1435885199446" TEXT="EntryID geh&#xf6;rt in Library">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1435885214592" ID="ID_1198930165" MODIFIED="1435885223858" TEXT="sanitise st&#xf6;rt">
<node CREATED="1435885226222" ID="ID_776697956" MODIFIED="1435885235138" TEXT="verschiebe in EntryID"/>
<node CREATED="1435885235583" ID="ID_444167455" MODIFIED="1435885247194" TEXT="verwende Subklasse"/>
</node>
</node>
</node>