Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortamasmeszaros <meszaros.q@gmail.com>2019-12-05 16:40:31 +0300
committertamasmeszaros <meszaros.q@gmail.com>2019-12-05 16:40:31 +0300
commit5623e0b3409c7f0c7d6c655d32c176a852f00719 (patch)
tree25ed8f7a8a90f4d5ba4f9e3ba2a2ccc292fa68c5 /tests/cpp17
parent60758abbb4554f32e74f3d33dfebe9b9980c4aed (diff)
Test cpp17 features on the build server.
Diffstat (limited to 'tests/cpp17')
-rw-r--r--tests/cpp17/CMakeLists.txt9
-rw-r--r--tests/cpp17/main.cpp72
2 files changed, 81 insertions, 0 deletions
diff --git a/tests/cpp17/CMakeLists.txt b/tests/cpp17/CMakeLists.txt
new file mode 100644
index 000000000..4e151ecbf
--- /dev/null
+++ b/tests/cpp17/CMakeLists.txt
@@ -0,0 +1,9 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(Cpp17Test)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+add_executable(cpp17test main.cpp)
+
diff --git a/tests/cpp17/main.cpp b/tests/cpp17/main.cpp
new file mode 100644
index 000000000..2fc60d635
--- /dev/null
+++ b/tests/cpp17/main.cpp
@@ -0,0 +1,72 @@
+#include <cstdlib>
+#include <iostream>
+#include <tuple>
+#include <string>
+// Test for nested namespace definition
+namespace PrusaSlicer::Cpp17 {
+
+template<class T> class Foo
+{
+ T m_arg;
+public:
+
+ explicit Foo(T &&arg): m_arg{arg} {}
+};
+
+} // namespace PrusaSlicer::Cpp17
+
+template<class T> std::string get_type(const T &v);
+
+template<> std::string get_type(const int &) { return "int"; }
+template<> std::string get_type(const double &) { return "double"; }
+template<> std::string get_type(const float &) { return "double"; }
+
+int main()
+{
+ // /////////////////////////////////////////////////////////////////////////
+ // Template argument deduction for class templates
+ // /////////////////////////////////////////////////////////////////////////
+
+ auto foo = PrusaSlicer::Cpp17::Foo{1.f};
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Structured bindings:
+ // /////////////////////////////////////////////////////////////////////////
+
+ auto my_tuple = std::make_tuple(0.2, 10);
+
+ auto [a, b] = my_tuple;
+
+ std::cout << "a is " << get_type(a) << std::endl;
+ std::cout << "b is " << get_type(b) << std::endl;
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Test for std::apply()
+ // /////////////////////////////////////////////////////////////////////////
+
+ auto fun = [] (auto a, auto b) {
+ std::cout << "a (" << get_type(a) << ") = " << a << std::endl;
+ std::cout << "b (" << get_type(b) << ") = " << b << std::endl;
+ };
+
+ std::apply(fun, my_tuple);
+
+ // /////////////////////////////////////////////////////////////////////////
+ // constexpr lambda and if
+ // /////////////////////////////////////////////////////////////////////////
+
+ auto isIntegral = [](auto v) constexpr -> bool {
+ if constexpr (std::is_integral_v<decltype(v)>) {
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ static_assert (isIntegral(10), "" );
+ // would fail to compile: static_assert (isIntegral(10.0), "" );
+ std::cout << "Integer is integral: " << isIntegral(0) << std::endl;
+ std::cout << "Floating point is not integral: " << isIntegral(0.0) << std::endl;
+
+ return EXIT_SUCCESS;
+}