From fe7740100ae0aec50a168e526afa7bb7b924a291 Mon Sep 17 00:00:00 2001 From: Avril Date: Mon, 7 Jun 2021 18:56:19 +0100 Subject: [PATCH] better Area controls made integer constructors explicit --- include/cow.hpp | 6 +++++- include/cow/area.hpp | 9 ++++++++- src/area.cpp | 5 +++++ src/cow.cpp | 2 ++ src/test/main.cpp | 4 +++- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/cow.hpp b/include/cow.hpp index 9b4e793..75313b9 100644 --- a/include/cow.hpp +++ b/include/cow.hpp @@ -10,7 +10,7 @@ struct Cow : public _cow_util::Span { struct Fake; Cow() = delete; - Cow(size_t size); + explicit Cow(size_t size); Cow(Cow&& m); virtual ~Cow(); @@ -34,6 +34,8 @@ struct Cow : public _cow_util::Span { static Cow from_raw(cow_t* owned); + virtual cow_t* raw() const; + private: struct _inner; Cow(cow_t* raw); @@ -56,6 +58,8 @@ struct Cow::Fake : public Cow { static Fake from_real(const Cow& real); + inline cow_t* raw() const override { return fake; } + protected: cow_t* get_raw() const override; private: diff --git a/include/cow/area.hpp b/include/cow/area.hpp index 8c204ef..baeebf2 100644 --- a/include/cow/area.hpp +++ b/include/cow/area.hpp @@ -7,10 +7,15 @@ #include struct Area { - Area(size_t sz); + 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(); } @@ -22,6 +27,8 @@ struct Area { inline bool is_clone() const { return dynamic_cast(_area.get()) != nullptr; } + inline cow_t* raw() const { return _area->raw(); } + ~Area(); private: const std::unique_ptr _area; diff --git a/src/area.cpp b/src/area.cpp index af42b58..730763c 100644 --- a/src/area.cpp +++ b/src/area.cpp @@ -6,3 +6,8 @@ Area::Area(const Area& copy) : Area::Area(Area&& move) : _area(std::move(*const_cast*>(&move._area))){} Area::~Area(){} + +Area::Area(Cow&& r) : + _area(std::make_unique(std::move(r))){} +Area::Area(const Cow& r) : + _area(std::make_unique(r.clone())){} diff --git a/src/cow.cpp b/src/cow.cpp index 50586bf..3a05c08 100644 --- a/src/cow.cpp +++ b/src/cow.cpp @@ -41,6 +41,8 @@ cow_t* Cow::get_raw() const { return super->ptr(); } size_t Cow::size() const { return super->cow.size; } +cow_t* Cow::raw() const { return &super->cow; } + Cow::Fake::Fake(const Cow& copy) : Cow(copy), fake(cow_clone(copy.super->ptr())){} Cow::Fake::Fake(const Fake& copy) : Cow(copy), fake(cow_clone(copy.fake)){}//Fake(*static_cast(©)){} Cow::Fake::Fake(Fake&& move) : Cow(std::move(move)), fake(move.fake) diff --git a/src/test/main.cpp b/src/test/main.cpp index 25c3d44..84256dc 100644 --- a/src/test/main.cpp +++ b/src/test/main.cpp @@ -170,7 +170,9 @@ void moving_cow(Cow moved) int main() { - Area area(4000); + Cow _area(4000); + + Area area = std::move(_area); write_fake(area, "Hello???"); Area area2 = area; write_fake(area2, "Hi");