prime/include/rstl/optional_object.hpp

47 lines
877 B
C++

#ifndef _RSTL_OPTIONAL_OBJECT_HPP
#define _RSTL_OPTIONAL_OBJECT_HPP
#include "types.h"
#include "rstl/construct.hpp"
namespace rstl {
template < typename T >
class optional_object {
public:
optional_object() : x4_valid(false) {}
optional_object(const T& item) : x0_item(item), x4_valid(true) {}
~optional_object() { clear(); }
optional_object& operator=(const T& item) {
assign(item);
return *this;
}
T& data() { return x0_item; }
T* get_ptr() { return &x0_item; }
operator bool() const { return x4_valid; }
void clear() {
rstl::destroy(&x0_item);
x4_valid = false;
}
T& operator*() { return data(); }
private:
T x0_item;
bool x4_valid;
void assign(const T& item) {
if (!x4_valid) {
rstl::construct(get_ptr(), item);
x4_valid = true;
} else {
data() = item;
}
}
};
} // namespace rstl
#endif