mirror of https://github.com/CGAL/cgal
working version of Pair_optional_adaptor
This commit is contained in:
parent
59ab39997e
commit
4c1cf8d9c4
|
|
@ -511,7 +511,7 @@ public:
|
||||||
\return pair of the property map and a Boolean which is `true` if the property needed to be created
|
\return pair of the property map and a Boolean which is `true` if the property needed to be created
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::pair<Property_map<T>, bool>
|
Pair_optional_adaptor<Property_map<T>>
|
||||||
add_property(const std::string& name, const T default_value = T()) {
|
add_property(const std::string& name, const T default_value = T()) {
|
||||||
auto p = m_node_properties.get_or_add_property(name, default_value);
|
auto p = m_node_properties.get_or_add_property(name, default_value);
|
||||||
return std::pair<Property_map<T>, bool>(Property_map<T>(p.first), p.second);
|
return std::pair<Property_map<T>, bool>(Property_map<T>(p.first), p.second);
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,14 @@ int main(void) {
|
||||||
auto prop5 = tree.add_property("test", int(0));
|
auto prop5 = tree.add_property("test", int(0));
|
||||||
assert(!prop5.second);
|
assert(!prop5.second);
|
||||||
|
|
||||||
|
auto a3 = tree.add_property("test1", int(0));
|
||||||
|
std::pair<typename Octree::Property_map<int>, bool> p3 = tree.add_property("test2", int(0));
|
||||||
|
std::optional<typename Octree::Property_map<int>> o3 = tree.add_property("test3", int(0));
|
||||||
|
|
||||||
|
auto a4 = tree.add_property("test", int(0));
|
||||||
|
std::pair<typename Octree::Property_map<int>, bool> p4 = tree.add_property("test", int(0));
|
||||||
|
std::optional<typename Octree::Property_map<int>> o4 = tree.add_property("test", int(0));
|
||||||
|
|
||||||
auto a1 = tree.property<int>("test");
|
auto a1 = tree.property<int>("test");
|
||||||
std::pair<typename Octree::Property_map<int>, bool> p1 = tree.property<int>("test");
|
std::pair<typename Octree::Property_map<int>, bool> p1 = tree.property<int>("test");
|
||||||
std::optional<typename Octree::Property_map<int>> o1 = tree.property<int>("test");
|
std::optional<typename Octree::Property_map<int>> o1 = tree.property<int>("test");
|
||||||
|
|
|
||||||
|
|
@ -19,40 +19,29 @@ namespace CGAL {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class Pair_optional_adaptor : public std::optional<T> {
|
class Pair_optional_adaptor : public std::optional<T> {
|
||||||
public:
|
public:
|
||||||
Pair_optional_adaptor(std::optional<T>& obj) : std::optional<T>(obj), second(obj.has_value()), first(u.t) {
|
Pair_optional_adaptor(std::optional<T>& obj) : std::optional<T>(obj), second(obj.has_value()), first(t_storage.t) {
|
||||||
std::cout << "optional constructor" << std::endl;
|
|
||||||
if (obj.has_value())
|
if (obj.has_value())
|
||||||
u.t = *obj;
|
t_storage.t = *obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pair_optional_adaptor(const std::nullopt_t& obj) : std::optional<T>(std::nullopt), second(false), first(u.t) {
|
Pair_optional_adaptor(const std::nullopt_t& obj) : std::optional<T>(std::nullopt), second(false), first(t_storage.t) {}
|
||||||
std::cout << "nullopt constructor" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
Pair_optional_adaptor(std::pair<T, bool>& p) : std::optional<T>(b ? p.first : std::nullopt), first(p.first), second(b) {
|
Pair_optional_adaptor(std::pair<T, bool>& p) : std::optional<T>(p.second ? p.first : std::optional<T>()), first(t_storage.t), second(p.second), t_storage(p.first) {}
|
||||||
std::cout << "pair constructor" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator std::pair<T, bool>() {
|
operator std::pair<T, bool>() {
|
||||||
return std::pair<T, bool>(first, second);
|
return std::pair<T, bool>(first, second);
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::optional<T>() {
|
|
||||||
if (second)
|
|
||||||
return std::optional<T>(first);
|
|
||||||
else return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
T &first;
|
T &first;
|
||||||
bool second;
|
bool second;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union U {
|
union T_value {
|
||||||
T t;
|
T t;
|
||||||
int i;
|
int i;
|
||||||
U() : i(0) {}
|
T_value() : i(0) {}
|
||||||
U(T t) : t(t) {}
|
T_value(T t) : t(t) {}
|
||||||
} u;
|
} t_storage;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // CGAL
|
} // CGAL
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue