From d85fe40f5978642d82ebda9b9f4d57a6beb47d3f Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Mon, 9 Nov 2015 18:04:43 +0100 Subject: [PATCH 1/8] Added build support for C++11. FindCXX11.cmake copied from OpenFlipper. --- CMakeLists.txt | 10 +++++ cmake/FindCXX11.cmake | 71 ++++++++++++++++++++++++++++++++++++ src/Unittests/CMakeLists.txt | 10 +++++ 3 files changed, 91 insertions(+) create mode 100644 cmake/FindCXX11.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b8eb0f39..b1d57c19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,16 @@ include (ACGOutput) # Definitions # ======================================================================== +set(INHIBIT_CXX11_SUPPORT OFF CACHE BOOL "Do not use C++11 even if it is available. (This is mainly useful for unit testing.)") + +if (NOT INHIBIT_CXX11_SUPPORT) +find_package (CXX11) + +if (CXX11_FOUND) + add_definitions(${CXX11_FLAGS} -DCPP11_ENABLED) +endif (CXX11_FOUND) +endif (NOT INHIBIT_CXX11_SUPPORT) + if (WIN32) add_definitions( -D_USE_MATH_DEFINES -DNOMINMAX diff --git a/cmake/FindCXX11.cmake b/cmake/FindCXX11.cmake new file mode 100644 index 00000000..a1fe935c --- /dev/null +++ b/cmake/FindCXX11.cmake @@ -0,0 +1,71 @@ +IF (NOT CXX11_FLAGS OR NOT CXX11_FOUND) +include(CheckCXXSourceCompiles) +include(FindPackageHandleStandardArgs) + +set(CXX11_FLAG_CANDIDATES + #Gnu and Intel Linux + "-std=c++11" + #Microsoft Visual Studio, and everything that automatically accepts C++11 + " " + #Intel windows + "/Qstd=c++0x" + ) + +set(CXX11_TEST_SOURCE +" +#include +#include +#include + +class Matrix { +public: + // Initializer lists + Matrix(int a, int b, int c, int d) + : data {a, b, c, d} + { + // Lambda functions + std::transform(data, data+4, data, + [](int x) { return x+1; }); + } + + // rvalue references + Matrix(Matrix &&rhs) { + } + +private: + int data[4]; +}; + +int main() +{ + int n[] {4,7,6,1,2}; + // auto + for (auto i : n) { + Matrix mat (3,5,1,2); + + // std::move, unique_ptr + std::unique_ptr m2( + new Matrix(std::move(mat))); + } + return 0; +} +") + +foreach(FLAG ${CXX11_FLAG_CANDIDATES}) + set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") + set(CMAKE_REQUIRED_FLAGS "${FLAG}") + unset(CXX11_FLAG_DETECTED CACHE) + + check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED) + set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}") + if(CXX11_FLAG_DETECTED) + set(CXX11_FLAGS_INTERNAL "${FLAG}") + break() + endif(CXX11_FLAG_DETECTED) +endforeach(FLAG ${CXX11_FLAG_CANDIDATES}) + +set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}") + +find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS) +mark_as_advanced(CXX11_FLAGS) +ENDIF() \ No newline at end of file diff --git a/src/Unittests/CMakeLists.txt b/src/Unittests/CMakeLists.txt index 270f4242..a629979d 100644 --- a/src/Unittests/CMakeLists.txt +++ b/src/Unittests/CMakeLists.txt @@ -22,6 +22,16 @@ if ( OPENMESH_BUILD_UNIT_TESTS ) # set additional link directories link_directories(${GTEST_LIBRARY_DIR} ) + set(INHIBIT_CXX11_SUPPORT OFF CACHE BOOL "Do not use C++11 even if it is available. (This is mainly useful for unit testing.)") + + if (NOT INHIBIT_CXX11_SUPPORT) + find_package (CXX11) + + if (CXX11_FOUND) + add_definitions(${CXX11_FLAGS} -DCPP11_ENABLED) + endif (CXX11_FOUND) + endif (NOT INHIBIT_CXX11_SUPPORT) + if ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*" ) add_definitions( /D _VARIADIC_MAX=10 ) endif() From 97ccb1d641176dabd83d92be2d3a2a7056615db1 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Mon, 9 Nov 2015 18:46:39 +0100 Subject: [PATCH 2/8] Modernized VectorT constructors in C++11 branch. * Less redundancy. * We can now make some of the VectorT constructors constexpr which is useful for other features. --- src/OpenMesh/Core/Geometry/VectorT.hh | 48 +++++++++++++++++------ src/OpenMesh/Core/Geometry/VectorT_inc.hh | 13 +++++- src/Unittests/unittests_vector_type.cc | 28 +++++++++++++ 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/OpenMesh/Core/Geometry/VectorT.hh b/src/OpenMesh/Core/Geometry/VectorT.hh index 5b552072..9c3db706 100644 --- a/src/OpenMesh/Core/Geometry/VectorT.hh +++ b/src/OpenMesh/Core/Geometry/VectorT.hh @@ -67,7 +67,6 @@ //== INCLUDES ================================================================= - #include #include #include @@ -78,6 +77,10 @@ #include #endif +#ifdef CPP11_ENABLED +#include +#include +#endif //== NAMESPACES =============================================================== @@ -98,22 +101,45 @@ namespace OpenMesh { aligned, so that aligned SSE instructions can be used on these vectors. */ -template struct VectorDataT -{ - Scalar values_[N]; +template class VectorDataT { + public: +#ifdef CPP11_ENABLED + VectorDataT() {} + + template + constexpr VectorDataT(T... vs) : values_ {vs...} { + static_assert(sizeof...(vs) == N, + "Incorrect number of vector components supplied."); + } + std::array values_; +#else + Scalar values_[N]; +#endif }; #if defined(__GNUC__) && defined(__SSE__) /// This specialization enables us to use aligned SSE instructions. -template <> struct VectorDataT -{ - union - { - __m128 m128; - float values_[4]; - }; +template<> class VectorDataT { + public: +#ifdef CPP11_ENABLED + VectorDataT() {} + + template + constexpr VectorDataT(T... vs) : values_ {vs...} { + static_assert(sizeof...(vs) == 4, + "Incorrect number of vector components supplied."); + } +#endif + union { + __m128 m128; +#ifdef CPP11_ENABLED + std::array values_; +#else + float values_[4]; +#endif + }; }; #endif diff --git a/src/OpenMesh/Core/Geometry/VectorT_inc.hh b/src/OpenMesh/Core/Geometry/VectorT_inc.hh index e76ca544..b0c682e8 100644 --- a/src/OpenMesh/Core/Geometry/VectorT_inc.hh +++ b/src/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -97,6 +97,15 @@ public: /// default constructor creates uninitialized values. inline VectorT() {} +#ifdef CPP11_ENABLED + explicit inline VectorT(const Scalar& v) { + vectorize(v); + } + + template + constexpr VectorT(T... vs) : Base {vs...} + { } +#else /// special constructor for 1D vectors explicit inline VectorT(const Scalar& v) { // assert(DIM==1); @@ -124,6 +133,8 @@ public: const Scalar v2, const Scalar v3) { Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3; } + + VectorT homogenized() { return VectorT(Base::values_[0]/Base::values_[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); } #endif #if DIM == 5 @@ -142,7 +153,7 @@ public: Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5; } #endif - +#endif /// construct from a value array (explicit) explicit inline VectorT(const Scalar _values[DIM]) { memcpy(Base::values_, _values, DIM*sizeof(Scalar)); diff --git a/src/Unittests/unittests_vector_type.cc b/src/Unittests/unittests_vector_type.cc index 240eab07..0d157766 100644 --- a/src/Unittests/unittests_vector_type.cc +++ b/src/Unittests/unittests_vector_type.cc @@ -83,6 +83,34 @@ TEST_F(OpenMeshVectorTest, VectorCasting) { } +#ifdef CPP11_ENABLED +TEST_F(OpenMeshVectorTest, cpp11_constructors) { + OpenMesh::Vec3d vec1 { 1.2, 2.0, 3.0 }; + EXPECT_EQ(1.2, vec1[0]); + EXPECT_EQ(2.0, vec1[1]); + EXPECT_EQ(3.0, vec1[2]); + + OpenMesh::Vec4f vec2 { 1.2f, 3.5f, 1.0f, 0.0f }; + + EXPECT_EQ(1.2f, vec2[0]); + EXPECT_EQ(3.5f, vec2[1]); + EXPECT_EQ(1.0f, vec2[2]); + EXPECT_EQ(0.0f, vec2[3]); + + OpenMesh::Vec4f vec2b { vec2 }; + + EXPECT_EQ(1.2f, vec2b[0]); + EXPECT_EQ(3.5f, vec2b[1]); + EXPECT_EQ(1.0f, vec2b[2]); + EXPECT_EQ(0.0f, vec2b[3]); + + OpenMesh::Vec4d vec4d { 1.23 }; + EXPECT_EQ(1.23, vec4d[0]); + EXPECT_EQ(1.23, vec4d[1]); + EXPECT_EQ(1.23, vec4d[2]); + EXPECT_EQ(1.23, vec4d[3]); +} +#endif } From c2c627ed4dd3cb13301e044b8dc5d114b9d19de4 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Mon, 9 Nov 2015 18:51:00 +0100 Subject: [PATCH 3/8] C++11: Added _htmlColor literal operator. Allows inline specification of colors in HTML syntax. --- src/OpenMesh/Core/Geometry/VectorT.hh | 20 ++++++++++++++++++++ src/Unittests/unittests_vector_type.cc | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/OpenMesh/Core/Geometry/VectorT.hh b/src/OpenMesh/Core/Geometry/VectorT.hh index 9c3db706..9dad0795 100644 --- a/src/OpenMesh/Core/Geometry/VectorT.hh +++ b/src/OpenMesh/Core/Geometry/VectorT.hh @@ -412,6 +412,26 @@ typedef VectorT Vec6d; //============================================================================= } // namespace OpenMesh //============================================================================= + + +#ifdef CPP11_ENABLED +/** + * Literal operator for inline specification of colors in HTML syntax. + * + * Example: + * \code{.cpp} + * OpenMesh::Vec4f light_blue = 0x1FCFFFFF_htmlColor; + * \endcode + */ +constexpr OpenMesh::Vec4f operator"" _htmlColor(unsigned long long raw_color) { + return OpenMesh::Vec4f( + ((raw_color >> 24) & 0xFF) / 255.0f, + ((raw_color >> 16) & 0xFF) / 255.0f, + ((raw_color >> 8) & 0xFF) / 255.0f, + ((raw_color >> 0) & 0xFF) / 255.0f); +} +#endif + #endif // OPENMESH_VECTOR_HH defined //============================================================================= #endif // DOXYGEN diff --git a/src/Unittests/unittests_vector_type.cc b/src/Unittests/unittests_vector_type.cc index 0d157766..58172537 100644 --- a/src/Unittests/unittests_vector_type.cc +++ b/src/Unittests/unittests_vector_type.cc @@ -111,6 +111,18 @@ TEST_F(OpenMeshVectorTest, cpp11_constructors) { EXPECT_EQ(1.23, vec4d[2]); EXPECT_EQ(1.23, vec4d[3]); } + +TEST_F(OpenMeshVectorTest, cpp11_htmlColorLiteral) { + const OpenMesh::Vec4f light_blue = 0x1FCFFFFF_htmlColor; + EXPECT_LE((OpenMesh::Vec4f(0.1215686274f, 0.8117647058f, 1.0f, 1.0f) + - light_blue).sqrnorm(), 1e-10); + + const auto light_blue_2 = 0x1FCFFFFF_htmlColor; + // Check whether auto type deduction works as expected. + static_assert(std::is_same + ::value, "Bad type deduced from _htmlColor literal."); + EXPECT_EQ(light_blue, light_blue_2); +} #endif } From 26914cba92731a517de7c25a010b303ea84bd791 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Mon, 9 Nov 2015 21:21:19 +0100 Subject: [PATCH 4/8] C++11: Legacy incompatibility fixes for VectorT C++11 features. --- src/OpenMesh/Core/Geometry/VectorT.hh | 1 + src/OpenMesh/Core/Geometry/VectorT_inc.hh | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/OpenMesh/Core/Geometry/VectorT.hh b/src/OpenMesh/Core/Geometry/VectorT.hh index 9dad0795..38a463e8 100644 --- a/src/OpenMesh/Core/Geometry/VectorT.hh +++ b/src/OpenMesh/Core/Geometry/VectorT.hh @@ -80,6 +80,7 @@ #ifdef CPP11_ENABLED #include #include +#include #endif //== NAMESPACES =============================================================== diff --git a/src/OpenMesh/Core/Geometry/VectorT_inc.hh b/src/OpenMesh/Core/Geometry/VectorT_inc.hh index b0c682e8..6fd4d3c3 100644 --- a/src/OpenMesh/Core/Geometry/VectorT_inc.hh +++ b/src/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -98,11 +98,11 @@ public: inline VectorT() {} #ifdef CPP11_ENABLED - explicit inline VectorT(const Scalar& v) { + explicit inline VectorT(const Scalar &v) { vectorize(v); } - template + template::type> constexpr VectorT(T... vs) : Base {vs...} { } #else @@ -154,9 +154,10 @@ public: } #endif #endif + /// construct from a value array (explicit) explicit inline VectorT(const Scalar _values[DIM]) { - memcpy(Base::values_, _values, DIM*sizeof(Scalar)); + memcpy(data(), _values, DIM*sizeof(Scalar)); } @@ -196,11 +197,19 @@ public: // /// cast to const Scalar array // inline operator const Scalar*() const { return Base::values_; } +#ifdef CPP11_ENABLED + /// access to Scalar array + inline Scalar* data() { return Base::values_.data(); } + + /// access to const Scalar array + inline const Scalar*data() const { return Base::values_.data(); } +#else /// access to Scalar array inline Scalar* data() { return Base::values_; } /// access to const Scalar array inline const Scalar*data() const { return Base::values_; } +#endif From dda4b41cac6264d7ddd7ee1004c5edce919a3ec0 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Mon, 9 Nov 2015 22:55:42 +0100 Subject: [PATCH 5/8] C++11: Got rid of narrowing conversion warnings in legacy code. Added explicit static_cast along with static SFINAE checks to VectorT constructor. --- src/OpenMesh/Core/Geometry/VectorT.hh | 17 +++++++++++++++++ src/OpenMesh/Core/Geometry/VectorT_inc.hh | 6 ++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/OpenMesh/Core/Geometry/VectorT.hh b/src/OpenMesh/Core/Geometry/VectorT.hh index 38a463e8..7be16f0e 100644 --- a/src/OpenMesh/Core/Geometry/VectorT.hh +++ b/src/OpenMesh/Core/Geometry/VectorT.hh @@ -92,6 +92,23 @@ namespace OpenMesh { //== CLASS DEFINITION ========================================================= +#if CPP11_ENABLED +/* + * Helpers for VectorT + */ +namespace { +template +struct are_convertible_to; + +template +struct are_convertible_to { + static constexpr bool value = std::is_convertible::value && are_convertible_to::value; +}; +template +struct are_convertible_to : public std::is_convertible {}; +} +#endif + /** The N values of the template Scalar type are the only data members of the class VectorT. This guarantees 100% compatibility diff --git a/src/OpenMesh/Core/Geometry/VectorT_inc.hh b/src/OpenMesh/Core/Geometry/VectorT_inc.hh index 6fd4d3c3..3f045a19 100644 --- a/src/OpenMesh/Core/Geometry/VectorT_inc.hh +++ b/src/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -102,8 +102,10 @@ public: vectorize(v); } - template::type> - constexpr VectorT(T... vs) : Base {vs...} + template::type, + typename = typename std::enable_if::value>::type> + constexpr VectorT(T... vs) : Base { static_cast(vs)...} { } #else /// special constructor for 1D vectors From d147b6cf66c2f208a5e1f7a3cf970a3d8415a576 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Mon, 9 Nov 2015 23:06:47 +0100 Subject: [PATCH 6/8] C++11: Enable c++11 support when building as part of OpenFlipper. --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b1d57c19..5a86e947 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,12 @@ else() set (OPENMESH_FOUND true PARENT_SCOPE) set (OPENMESH_LIBRARIES OpenMeshCore OpenMeshTools PARENT_SCOPE) set (OPENMESH_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/src" PARENT_SCOPE) + set (OPENMESH_FLAGS "" PARENT_SCOPE) + if (NOT INHIBIT_CXX11_SUPPORT) + if (CXX11_FOUND) + set(OPENMESH_FLAGS "${CXX11_FLAGS};-DCPP11_ENABLED" PARENT_SCOPE) + endif (CXX11_FOUND) + endif (NOT INHIBIT_CXX11_SUPPORT) # Also define variables provided by the old legacy finder. set (OPENMESH_CORE_LIBRARY OpenMeshCore PARENT_SCOPE) From dfcc98c8454de8e2ee9f42231bcc55c314ed97b4 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Tue, 10 Nov 2015 14:59:43 +0100 Subject: [PATCH 7/8] C++11: Do CMake-less C++11 checking. --- CMakeLists.txt | 16 ----- cmake/FindCXX11.cmake | 71 ----------------------- src/OpenMesh/Core/Geometry/VectorT.hh | 12 ++-- src/OpenMesh/Core/Geometry/VectorT_inc.hh | 4 +- src/Unittests/CMakeLists.txt | 10 ---- src/Unittests/unittests_vector_type.cc | 4 +- 6 files changed, 11 insertions(+), 106 deletions(-) delete mode 100644 cmake/FindCXX11.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a86e947..b8eb0f39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,16 +33,6 @@ include (ACGOutput) # Definitions # ======================================================================== -set(INHIBIT_CXX11_SUPPORT OFF CACHE BOOL "Do not use C++11 even if it is available. (This is mainly useful for unit testing.)") - -if (NOT INHIBIT_CXX11_SUPPORT) -find_package (CXX11) - -if (CXX11_FOUND) - add_definitions(${CXX11_FLAGS} -DCPP11_ENABLED) -endif (CXX11_FOUND) -endif (NOT INHIBIT_CXX11_SUPPORT) - if (WIN32) add_definitions( -D_USE_MATH_DEFINES -DNOMINMAX @@ -107,12 +97,6 @@ else() set (OPENMESH_FOUND true PARENT_SCOPE) set (OPENMESH_LIBRARIES OpenMeshCore OpenMeshTools PARENT_SCOPE) set (OPENMESH_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/src" PARENT_SCOPE) - set (OPENMESH_FLAGS "" PARENT_SCOPE) - if (NOT INHIBIT_CXX11_SUPPORT) - if (CXX11_FOUND) - set(OPENMESH_FLAGS "${CXX11_FLAGS};-DCPP11_ENABLED" PARENT_SCOPE) - endif (CXX11_FOUND) - endif (NOT INHIBIT_CXX11_SUPPORT) # Also define variables provided by the old legacy finder. set (OPENMESH_CORE_LIBRARY OpenMeshCore PARENT_SCOPE) diff --git a/cmake/FindCXX11.cmake b/cmake/FindCXX11.cmake deleted file mode 100644 index a1fe935c..00000000 --- a/cmake/FindCXX11.cmake +++ /dev/null @@ -1,71 +0,0 @@ -IF (NOT CXX11_FLAGS OR NOT CXX11_FOUND) -include(CheckCXXSourceCompiles) -include(FindPackageHandleStandardArgs) - -set(CXX11_FLAG_CANDIDATES - #Gnu and Intel Linux - "-std=c++11" - #Microsoft Visual Studio, and everything that automatically accepts C++11 - " " - #Intel windows - "/Qstd=c++0x" - ) - -set(CXX11_TEST_SOURCE -" -#include -#include -#include - -class Matrix { -public: - // Initializer lists - Matrix(int a, int b, int c, int d) - : data {a, b, c, d} - { - // Lambda functions - std::transform(data, data+4, data, - [](int x) { return x+1; }); - } - - // rvalue references - Matrix(Matrix &&rhs) { - } - -private: - int data[4]; -}; - -int main() -{ - int n[] {4,7,6,1,2}; - // auto - for (auto i : n) { - Matrix mat (3,5,1,2); - - // std::move, unique_ptr - std::unique_ptr m2( - new Matrix(std::move(mat))); - } - return 0; -} -") - -foreach(FLAG ${CXX11_FLAG_CANDIDATES}) - set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") - set(CMAKE_REQUIRED_FLAGS "${FLAG}") - unset(CXX11_FLAG_DETECTED CACHE) - - check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED) - set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}") - if(CXX11_FLAG_DETECTED) - set(CXX11_FLAGS_INTERNAL "${FLAG}") - break() - endif(CXX11_FLAG_DETECTED) -endforeach(FLAG ${CXX11_FLAG_CANDIDATES}) - -set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}") - -find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS) -mark_as_advanced(CXX11_FLAGS) -ENDIF() \ No newline at end of file diff --git a/src/OpenMesh/Core/Geometry/VectorT.hh b/src/OpenMesh/Core/Geometry/VectorT.hh index 7be16f0e..0eeb74ba 100644 --- a/src/OpenMesh/Core/Geometry/VectorT.hh +++ b/src/OpenMesh/Core/Geometry/VectorT.hh @@ -77,7 +77,7 @@ #include #endif -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) #include #include #include @@ -92,7 +92,7 @@ namespace OpenMesh { //== CLASS DEFINITION ========================================================= -#if CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) /* * Helpers for VectorT */ @@ -121,7 +121,7 @@ struct are_convertible_to : public std::is_convertible {}; */ template class VectorDataT { public: -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) VectorDataT() {} template @@ -141,7 +141,7 @@ template class VectorDataT { /// This specialization enables us to use aligned SSE instructions. template<> class VectorDataT { public: -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) VectorDataT() {} template @@ -152,7 +152,7 @@ template<> class VectorDataT { #endif union { __m128 m128; -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) std::array values_; #else float values_[4]; @@ -432,7 +432,7 @@ typedef VectorT Vec6d; //============================================================================= -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) /** * Literal operator for inline specification of colors in HTML syntax. * diff --git a/src/OpenMesh/Core/Geometry/VectorT_inc.hh b/src/OpenMesh/Core/Geometry/VectorT_inc.hh index 3f045a19..bc7e1570 100644 --- a/src/OpenMesh/Core/Geometry/VectorT_inc.hh +++ b/src/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -97,7 +97,7 @@ public: /// default constructor creates uninitialized values. inline VectorT() {} -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) explicit inline VectorT(const Scalar &v) { vectorize(v); } @@ -199,7 +199,7 @@ public: // /// cast to const Scalar array // inline operator const Scalar*() const { return Base::values_; } -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) /// access to Scalar array inline Scalar* data() { return Base::values_.data(); } diff --git a/src/Unittests/CMakeLists.txt b/src/Unittests/CMakeLists.txt index a629979d..270f4242 100644 --- a/src/Unittests/CMakeLists.txt +++ b/src/Unittests/CMakeLists.txt @@ -22,16 +22,6 @@ if ( OPENMESH_BUILD_UNIT_TESTS ) # set additional link directories link_directories(${GTEST_LIBRARY_DIR} ) - set(INHIBIT_CXX11_SUPPORT OFF CACHE BOOL "Do not use C++11 even if it is available. (This is mainly useful for unit testing.)") - - if (NOT INHIBIT_CXX11_SUPPORT) - find_package (CXX11) - - if (CXX11_FOUND) - add_definitions(${CXX11_FLAGS} -DCPP11_ENABLED) - endif (CXX11_FOUND) - endif (NOT INHIBIT_CXX11_SUPPORT) - if ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*" ) add_definitions( /D _VARIADIC_MAX=10 ) endif() diff --git a/src/Unittests/unittests_vector_type.cc b/src/Unittests/unittests_vector_type.cc index 58172537..82e7793b 100644 --- a/src/Unittests/unittests_vector_type.cc +++ b/src/Unittests/unittests_vector_type.cc @@ -83,7 +83,7 @@ TEST_F(OpenMeshVectorTest, VectorCasting) { } -#ifdef CPP11_ENABLED +#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) TEST_F(OpenMeshVectorTest, cpp11_constructors) { OpenMesh::Vec3d vec1 { 1.2, 2.0, 3.0 }; @@ -113,6 +113,8 @@ TEST_F(OpenMeshVectorTest, cpp11_constructors) { } TEST_F(OpenMeshVectorTest, cpp11_htmlColorLiteral) { + static constexpr OpenMesh::Vec4f rose = 0xFFC7F1FF_htmlColor; + const OpenMesh::Vec4f light_blue = 0x1FCFFFFF_htmlColor; EXPECT_LE((OpenMesh::Vec4f(0.1215686274f, 0.8117647058f, 1.0f, 1.0f) - light_blue).sqrnorm(), 1e-10); From 0d619f33d349ce957eee0a2144a0a0393831a927 Mon Sep 17 00:00:00 2001 From: Hans-Christian Ebke Date: Tue, 10 Nov 2015 16:08:53 +0100 Subject: [PATCH 8/8] C++11: Create version of homogenized() for C++11 branch (without macros). --- src/OpenMesh/Core/Geometry/VectorT_inc.hh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/OpenMesh/Core/Geometry/VectorT_inc.hh b/src/OpenMesh/Core/Geometry/VectorT_inc.hh index bc7e1570..89c0d6d7 100644 --- a/src/OpenMesh/Core/Geometry/VectorT_inc.hh +++ b/src/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -107,6 +107,17 @@ public: typename = typename std::enable_if::value>::type> constexpr VectorT(T... vs) : Base { static_cast(vs)...} { } + + template::type> + typename std::enable_if::type + homogenized() const { + return VectorT( + Base::values_[0]/Base::values_[3], + Base::values_[1]/Base::values_[3], + Base::values_[2]/Base::values_[3], + 1); + } + #else /// special constructor for 1D vectors explicit inline VectorT(const Scalar& v) { @@ -136,7 +147,7 @@ public: Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3; } - VectorT homogenized() { return VectorT(Base::values_[0]/Base::values_[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); } + VectorT homogenized() const { return VectorT(Base::values_[0]/Base::values_[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); } #endif #if DIM == 5