// // Created by EmsiaetKadosh on 25-1-18. // #include "def.h" #include "exception.h" template Base& ObjectHolder::operator->() noexcept(false) { if (value) return *value; throw NullPointerException(L"value is null"); } template const Base& ObjectHolder::operator->() const noexcept(false) { if (value) return *value; throw NullPointerException(L"value is null"); } template Base& ObjectHolder::operator*() noexcept(false) { if (value) return *value; throw NullPointerException(L"value is null"); } template const Base& ObjectHolder::operator*() const noexcept(false) { if (value) return *value; throw NullPointerException(L"value is null"); } template template requires std::is_base_of_v && TypeName void ObjectHolder::set(const T& value) { if (!value) this->value = new T(value); else { if (hasValue) delete this->value; this->value = new T(value); } } template template requires std::is_base_of_v && TypeName void ObjectHolder::set(T&& value) { if (!value) this->value = new T(value); else { if (hasValue) delete this->value; this->value = new T(value); } } template const T& Reference::getLvalue() const noexcept(false) { if (type == ReferenceValueType::LVALUE) return *lvalue; throw NullPointerException(L"reference is rvalue"); } template T&& Reference::getRvalue() noexcept(false) { if (type == ReferenceValueType::RVALUE) return std::move(*rvalue); throw NullPointerException(L"reference is lvalue"); }