blob: 7619afbef1654a29cde9cacdc8a180242e9044e6 [file] [log] [blame]
/*
* holder.h
*
* Created on: 21.02.2019
* Author: psota
*/
#ifndef BASYX_object_ref_HOLDER_H
#define BASYX_object_ref_HOLDER_H
#include <memory>
#include <string>
#include <typeinfo>
#include <nlohmann/json.hpp>
#include <BaSyx/util/printer.h>
#include <BaSyx/util/util.h>
#include <BaSyx/shared/object/obj_placeholder.h>
#include <BaSyx/shared/serialization/json.h>
namespace basyx {
namespace detail {
// RefHolder:
// PlaceHolder storing an observing pointer to an object, instead of owning it, parametrized through template parameter T
template <typename T>
class objRefHolder : public objPlaceHolder {
public:
using json_t = nlohmann::json;
public:
T * const observed;
public: // structors
objRefHolder(const T & t)
: observed(&t) {};
objRefHolder(T* t)
: observed(t) {};
public:
virtual const std::type_info& type() const noexcept override
{
return typeid(T);
};
virtual bool compare(objPlaceHolder * rhs) const override {
if (rhs->type() != this->type())
return false;
return false;
// return *this->observed == static_cast<objHolder<T>*>(rhs)->stored;
}
virtual objPlaceHolder::HolderType get_holder_type() const noexcept override
{
return objPlaceHolder::HolderType::Observing;
};
virtual void * get_address() const noexcept override
{
return (void*)this->observed;
};
virtual basyx::type::objectType object_type() const override
{
return basyx::type::basyx_type<T>::object_type;
};
virtual basyx::type::valueType value_type() const override
{
return basyx::type::basyx_type<T>::value_type;
};
virtual void to_json(json_t& json) const override
{
json = basyx::serialization::json::serialize(*observed);
};
private:
objRefHolder& operator=(const objRefHolder&) = delete;
};
}
}
#endif /* BASYX_object_HOLDER_H */