--- /dev/null
+#pragma once
+
+#include <chrono>
+#include <string>
+#include <typeindex>
+
+template <typename Class>
+class BaseObject {
+private:
+ using HRC = std::chrono::high_resolution_clock;
+ using TP = std::chrono::time_point<HRC>;
+
+ const TP _pcid; // parent class id
+ const TP _cid; // class id
+ const std::type_index _cidx; // unique identifier
+
+public:
+ BaseObject()
+ : _pcid(TP::duration::zero()), _cid(HRC::now()), _cidx(typeid (Class))
+ {
+ }
+
+ BaseObject(const BaseObject& rhs)
+ : _pcid(rhs._cid), _cid(HRC::now()), _cidx(rhs._cidx)
+ {
+ }
+
+ BaseObject(const BaseObject&& rhs)
+ : _pcid(std::move(rhs._pcid)), _cid(std::move(rhs._cid)), _cidx(rhs._cidx)
+ {
+ }
+
+ virtual ~BaseObject()
+ {
+ }
+
+ BaseObject& operator=(const BaseObject& rhs)
+ {
+ _pcid = rhs._cid;
+ _cid = HRC::now();
+ _cidx = rhs._cidx;
+
+ return *this;
+ }
+
+ BaseObject& operator=(const BaseObject&& rhs)
+ {
+ _pcid = std::move(rhs._pcid);
+ _cid = std::move(rhs._cid);
+ _cidx = std::move(rhs._cidx);
+
+ return *this;
+ }
+
+ size_t pcid() const
+ {
+ return _pcid;
+ }
+
+ size_t cid() const
+ {
+ return _cid;
+ }
+
+ std::type_index cindex() const
+ {
+ return _cidx;
+ }
+};