// `Area` is a copyable type that opaquely represents either `Cow` or `Cow::Fake`. #pragma once #include #include #include #include "slice.hpp" namespace _cow_util { struct Area : public Span { Area() = delete; explicit Area(size_t sz); Area(const Area& area); Area(Area&& area); Area(Cow&& move); explicit Area(const Cow& copy); inline const Cow* operator->() const { return _area.get(); } inline Cow* operator->() { return _area.get(); } inline const Cow* operator*() const { return _area.get(); } inline Cow* operator*() { return _area.get(); } inline operator const Cow&() const { return *_area.get(); } inline operator Cow&() { return *_area.get(); } inline bool is_clone() const { return dynamic_cast(_area.get()) != nullptr; } inline cow_t* raw() const { return _area->raw(); } inline size_t size() const override { return _area->size(); } ~Area(); protected: inline void* area() override { return _area->ptr(); } inline const void* area() const override { return _area->ptr(); } private: const std::unique_ptr _area; }; }