diff --git a/source/simple/geom/vector.hpp b/source/simple/geom/vector.hpp index de217ed528933e8ede2c31124bcea29501cd1340..ca6cc44b4f0afac622f25d5986e7e648c30479df 100644 --- a/source/simple/geom/vector.hpp +++ b/source/simple/geom/vector.hpp @@ -393,6 +393,16 @@ namespace simple::geom one[i] = !one[i]; return one; } + template <typename C = typename meta::coordinate_type, + std::enable_if_t<std::is_same_v<C,bool>>* = nullptr> + [[nodiscard]] + friend + constexpr vector operator !(vector one) noexcept + { + for(size_t i = 0; i < Dimensions; ++i) + one[i] = !one[i]; + return one; + } template <size_t dimension> [[nodiscard]] diff --git a/unit_tests/point.cpp b/unit_tests/point.cpp index 984659ba801d172d4fcca19de111bae76b8ff02c..165b3c1689bdc9e027ca6f52de38ca94b7de0cd2 100644 --- a/unit_tests/point.cpp +++ b/unit_tests/point.cpp @@ -398,6 +398,11 @@ void DiscreteArithmetic() assert( ~vector(true, false, true, false) == vector(false, true, false, true) ); assert( ~vector(true, true, false, false) == vector(false, false, true, true) ); assert( ~vector(true, true, true, true) == vector(false, false, false, false) ); + + // ! for vector<bool> + assert( (!vector(true, false, true, false)) == vector(false, true, false, true) ); + assert( (!vector(true, true, false, false)) == vector(false, false, true, true) ); + assert( (!vector(true, true, true, true)) == vector(false, false, false, false) ); } void ComparisonOperators()