aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt28
-rw-r--r--CheckCXX11Features.cmake103
-rw-r--r--c++11/c++11-test-__func__-N2340.cpp8
-rw-r--r--c++11/c++11-test-auto-N2546.cpp12
-rw-r--r--c++11/c++11-test-constexpr-N2235.cpp19
-rw-r--r--c++11/c++11-test-cstdint.cpp10
-rw-r--r--c++11/c++11-test-decltype-N2343.cpp11
-rw-r--r--c++11/c++11-test-lambda-N2927.cpp5
-rw-r--r--c++11/c++11-test-long_long-N1811.cpp7
-rw-r--r--c++11/c++11-test-nullptr-N2431.cpp5
-rw-r--r--c++11/c++11-test-nullptr-N2431_fail_compile.cpp5
-rw-r--r--c++11/c++11-test-rvalue_references-N2118.cpp15
-rw-r--r--c++11/c++11-test-sizeof_member-N2253.cpp14
-rw-r--r--c++11/c++11-test-static_assert-N1720.cpp5
-rw-r--r--c++11/c++11-test-static_assert-N1720_fail_compile.cpp5
-rw-r--r--c++11/c++11-test-variadic_templates-N2555.cpp23
-rw-r--r--c++11/demo.cpp23
17 files changed, 294 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bb94909..8075f23 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,22 @@
cmake_minimum_required(VERSION 2.8)
project(EntityX)
-include_directories(.)
+include_directories(. ./c++11)
+
+# C++11 feature checks
+include(CheckCXX11Features.cmake)
+
+MACRO(REQUIRE FEATURE_NAME MESSAGE_STRING)
+ if (NOT DEFINED ${FEATURE_NAME})
+ message(FATAL_ERROR ${MESSAGE_STRING})
+ endif()
+ENDMACRO(REQUIRE)
+
+require(HAS_CXX11_AUTO "C++11 auto support is required")
+require(HAS_CXX11_NULLPTR "C++11 nullptr support is required")
+require(HAS_CXX11_RVALUE_REFERENCES "C++11 rvalue reference support is required")
+require(HAS_CXX11_CSTDINT_H "C++11 stdint support is required")
+require(HAS_CXX11_VARIADIC_TEMPLATES "C++11 variadic templates required")
+
enable_testing()
find_package(GTest REQUIRED)
set(Boost_USE_STATIC_LIBS OFF)
@@ -9,13 +25,17 @@ set(Boost_USE_STATIC_RUNTIME OFF)
#find_package(Boost REQUIRED COMPONENTS)
find_package(Boost 1.36.0 REQUIRED COMPONENTS signals)
+set(CMAKE_CXX_FLAGS "-ansi -pedantic -Werror -Wall -Wextra -Wno-unused-parameter -Wno-error=unused-variable -std=c++11")
+set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+
+
include_directories(
${Boost_INCLUDE_DIR}
${GTest_INCLUDE_DIR}
)
-add_definitions(
- -ansi -pedantic -Werror -Wall -Wextra -Wno-unused-parameter -Wno-error=unused-variable -std=c++11
- )
add_executable(
entityx_test
entityx/Components_test.cc
diff --git a/CheckCXX11Features.cmake b/CheckCXX11Features.cmake
new file mode 100644
index 0000000..fc1243f
--- /dev/null
+++ b/CheckCXX11Features.cmake
@@ -0,0 +1,103 @@
+# Checks for C++11 features
+# CXX11_FEATURE_LIST - a list containing all supported features
+# HAS_CXX11_AUTO - auto keyword
+# HAS_CXX11_NULLPTR - nullptr
+# HAS_CXX11_LAMBDA - lambdas
+# HAS_CXX11_STATIC_ASSERT - static_assert()
+# HAS_CXX11_RVALUE_REFERENCES - rvalue references
+# HAS_CXX11_DECLTYPE - decltype keyword
+# HAS_CXX11_CSTDINT_H - cstdint header
+# HAS_CXX11_LONG_LONG - long long signed & unsigned types
+# HAS_CXX11_VARIADIC_TEMPLATES - variadic templates
+# HAS_CXX11_CONSTEXPR - constexpr keyword
+# HAS_CXX11_SIZEOF_MEMBER - sizeof() non-static members
+# HAS_CXX11_FUNC - __func__ preprocessor constant
+#
+# Original script by Rolf Eike Beer
+# Modifications by Andreas Weis
+#
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3)
+
+SET(CHECK_CXX11_OLD_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+IF(CMAKE_COMPILER_IS_GNUCXX)
+ SET(CMAKE_CXX_FLAGS "-std=c++0x")
+endif()
+
+MACRO(CXX11_CHECK_FEATURE FEATURE_NAME FEATURE_NUMBER RESULT_VAR)
+ IF (NOT DEFINED ${RESULT_VAR})
+ SET(_bindir "${CMAKE_CURRENT_BINARY_DIR}/cxx11/cxx11_${FEATURE_NAME}")
+
+ IF (${FEATURE_NUMBER})
+ SET(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/c++11-test-${FEATURE_NAME}-N${FEATURE_NUMBER})
+ SET(_LOG_NAME "\"${FEATURE_NAME}\" (N${FEATURE_NUMBER})")
+ ELSE (${FEATURE_NUMBER})
+ SET(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/c++11-test-${FEATURE_NAME})
+ SET(_LOG_NAME "\"${FEATURE_NAME}\"")
+ ENDIF (${FEATURE_NUMBER})
+ MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME}")
+
+ SET(_SRCFILE "${_SRCFILE_BASE}.cpp")
+ SET(_SRCFILE_FAIL "${_SRCFILE_BASE}_fail.cpp")
+ SET(_SRCFILE_FAIL_COMPILE "${_SRCFILE_BASE}_fail_compile.cpp")
+
+ IF (CROSS_COMPILING)
+ try_compile(${RESULT_VAR} "${_bindir}" "${_SRCFILE}")
+ IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ try_compile(${RESULT_VAR} "${_bindir}_fail" "${_SRCFILE_FAIL}")
+ ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ ELSE (CROSS_COMPILING)
+ try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
+ "${_bindir}" "${_SRCFILE}")
+ IF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+ SET(${RESULT_VAR} TRUE)
+ ELSE (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+ SET(${RESULT_VAR} FALSE)
+ ENDIF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+ IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
+ "${_bindir}_fail" "${_SRCFILE_FAIL}")
+ IF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+ SET(${RESULT_VAR} TRUE)
+ ELSE (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+ SET(${RESULT_VAR} FALSE)
+ ENDIF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+ ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ ENDIF (CROSS_COMPILING)
+ IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
+ try_compile(_TMP_RESULT "${_bindir}_fail_compile" "${_SRCFILE_FAIL_COMPILE}")
+ IF (_TMP_RESULT)
+ SET(${RESULT_VAR} FALSE)
+ ELSE (_TMP_RESULT)
+ SET(${RESULT_VAR} TRUE)
+ ENDIF (_TMP_RESULT)
+ ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
+
+ IF (${RESULT_VAR})
+ MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME} -- works")
+ LIST(APPEND CXX11_FEATURE_LIST ${RESULT_VAR})
+ ELSE (${RESULT_VAR})
+ MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME} -- not supported")
+ ENDIF (${RESULT_VAR})
+ SET(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++11 support for ${_LOG_NAME}")
+ ENDIF (NOT DEFINED ${RESULT_VAR})
+ENDMACRO(CXX11_CHECK_FEATURE)
+
+CXX11_CHECK_FEATURE("auto" 2546 HAS_CXX11_AUTO)
+CXX11_CHECK_FEATURE("nullptr" 2431 HAS_CXX11_NULLPTR)
+CXX11_CHECK_FEATURE("lambda" 2927 HAS_CXX11_LAMBDA)
+CXX11_CHECK_FEATURE("static_assert" 1720 HAS_CXX11_STATIC_ASSERT)
+CXX11_CHECK_FEATURE("rvalue_references" 2118 HAS_CXX11_RVALUE_REFERENCES)
+CXX11_CHECK_FEATURE("decltype" 2343 HAS_CXX11_DECLTYPE)
+CXX11_CHECK_FEATURE("cstdint" "" HAS_CXX11_CSTDINT_H)
+CXX11_CHECK_FEATURE("long_long" 1811 HAS_CXX11_LONG_LONG)
+CXX11_CHECK_FEATURE("variadic_templates" 2555 HAS_CXX11_VARIADIC_TEMPLATES)
+CXX11_CHECK_FEATURE("constexpr" 2235 HAS_CXX11_CONSTEXPR)
+CXX11_CHECK_FEATURE("sizeof_member" 2253 HAS_CXX11_SIZEOF_MEMBER)
+CXX11_CHECK_FEATURE("__func__" 2340 HAS_CXX11_FUNC)
+
+SET(CXX11_FEATURE_LIST ${CXX11_FEATURE_LIST} CACHE STRING "C++11 feature support list")
+MARK_AS_ADVANCED(FORCE CXX11_FEATURE_LIST)
+
+SET(CMAKE_CXX_FLAGS ${CHECK_CXX11_OLD_CMAKE_CXX_FLAGS})
+UNSET(CHECK_CXX11_OLD_CMAKE_CXX_FLAGS)
+
diff --git a/c++11/c++11-test-__func__-N2340.cpp b/c++11/c++11-test-__func__-N2340.cpp
new file mode 100644
index 0000000..c10dd18
--- /dev/null
+++ b/c++11/c++11-test-__func__-N2340.cpp
@@ -0,0 +1,8 @@
+#include <cstring>
+
+int main()
+{
+ if (!__func__) { return 1; }
+ if(std::strlen(__func__) <= 0) { return 1; }
+ return 0;
+}
diff --git a/c++11/c++11-test-auto-N2546.cpp b/c++11/c++11-test-auto-N2546.cpp
new file mode 100644
index 0000000..dbff414
--- /dev/null
+++ b/c++11/c++11-test-auto-N2546.cpp
@@ -0,0 +1,12 @@
+
+int main()
+{
+ auto i = 5;
+ auto f = 3.14159f;
+ auto d = 3.14159;
+ bool ret = (
+ (sizeof(f) < sizeof(d)) &&
+ (sizeof(i) == sizeof(int))
+ );
+ return ret ? 0 : 1;
+}
diff --git a/c++11/c++11-test-constexpr-N2235.cpp b/c++11/c++11-test-constexpr-N2235.cpp
new file mode 100644
index 0000000..9f969e4
--- /dev/null
+++ b/c++11/c++11-test-constexpr-N2235.cpp
@@ -0,0 +1,19 @@
+constexpr int square(int x)
+{
+ return x*x;
+}
+
+constexpr int the_answer()
+{
+ return 42;
+}
+
+int main()
+{
+ int test_arr[square(3)];
+ bool ret = (
+ (square(the_answer()) == 1764) &&
+ (sizeof(test_arr)/sizeof(test_arr[0]) == 9)
+ );
+ return ret ? 0 : 1;
+}
diff --git a/c++11/c++11-test-cstdint.cpp b/c++11/c++11-test-cstdint.cpp
new file mode 100644
index 0000000..58d4381
--- /dev/null
+++ b/c++11/c++11-test-cstdint.cpp
@@ -0,0 +1,10 @@
+#include <cstdint>
+int main()
+{
+ bool test =
+ (sizeof(int8_t) == 1) &&
+ (sizeof(int16_t) == 2) &&
+ (sizeof(int32_t) == 4) &&
+ (sizeof(int64_t) == 8);
+ return test ? 0 : 1;
+}
diff --git a/c++11/c++11-test-decltype-N2343.cpp b/c++11/c++11-test-decltype-N2343.cpp
new file mode 100644
index 0000000..d023885
--- /dev/null
+++ b/c++11/c++11-test-decltype-N2343.cpp
@@ -0,0 +1,11 @@
+
+bool check_size(int i)
+{
+ return sizeof(int) == sizeof(decltype(i));
+}
+
+int main()
+{
+ bool ret = check_size(42);
+ return ret ? 0 : 1;
+}
diff --git a/c++11/c++11-test-lambda-N2927.cpp b/c++11/c++11-test-lambda-N2927.cpp
new file mode 100644
index 0000000..b86ad17
--- /dev/null
+++ b/c++11/c++11-test-lambda-N2927.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+ int ret = 0;
+ return ([&ret]() -> int { return ret; })();
+}
diff --git a/c++11/c++11-test-long_long-N1811.cpp b/c++11/c++11-test-long_long-N1811.cpp
new file mode 100644
index 0000000..2ae6988
--- /dev/null
+++ b/c++11/c++11-test-long_long-N1811.cpp
@@ -0,0 +1,7 @@
+int main(void)
+{
+ long long l;
+ unsigned long long ul;
+
+ return ((sizeof(l) >= 8) && (sizeof(ul) >= 8)) ? 0 : 1;
+}
diff --git a/c++11/c++11-test-nullptr-N2431.cpp b/c++11/c++11-test-nullptr-N2431.cpp
new file mode 100644
index 0000000..6c5ae66
--- /dev/null
+++ b/c++11/c++11-test-nullptr-N2431.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+ int* test = nullptr;
+ return test ? 1 : 0;
+}
diff --git a/c++11/c++11-test-nullptr-N2431_fail_compile.cpp b/c++11/c++11-test-nullptr-N2431_fail_compile.cpp
new file mode 100644
index 0000000..5747f1b
--- /dev/null
+++ b/c++11/c++11-test-nullptr-N2431_fail_compile.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+ int i = nullptr;
+ return 1;
+}
diff --git a/c++11/c++11-test-rvalue_references-N2118.cpp b/c++11/c++11-test-rvalue_references-N2118.cpp
new file mode 100644
index 0000000..ef4e421
--- /dev/null
+++ b/c++11/c++11-test-rvalue_references-N2118.cpp
@@ -0,0 +1,15 @@
+int foo(int& lvalue)
+{
+ return 123;
+}
+
+int foo(int&& rvalue)
+{
+ return 321;
+}
+
+int main()
+{
+ int i = 42;
+ return ((foo(i) == 123) && (foo(42) == 321)) ? 0 : 1;
+}
diff --git a/c++11/c++11-test-sizeof_member-N2253.cpp b/c++11/c++11-test-sizeof_member-N2253.cpp
new file mode 100644
index 0000000..3049ed1
--- /dev/null
+++ b/c++11/c++11-test-sizeof_member-N2253.cpp
@@ -0,0 +1,14 @@
+struct foo {
+ char bar;
+ int baz;
+};
+
+int main(void)
+{
+ bool ret = (
+ (sizeof(foo::bar) == 1) &&
+ (sizeof(foo::baz) >= sizeof(foo::bar)) &&
+ (sizeof(foo) >= sizeof(foo::bar)+sizeof(foo::baz))
+ );
+ return ret ? 0 : 1;
+}
diff --git a/c++11/c++11-test-static_assert-N1720.cpp b/c++11/c++11-test-static_assert-N1720.cpp
new file mode 100644
index 0000000..eae3c9a
--- /dev/null
+++ b/c++11/c++11-test-static_assert-N1720.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+ static_assert(0 < 1, "your ordering of integers is screwed");
+ return 0;
+}
diff --git a/c++11/c++11-test-static_assert-N1720_fail_compile.cpp b/c++11/c++11-test-static_assert-N1720_fail_compile.cpp
new file mode 100644
index 0000000..d97b679
--- /dev/null
+++ b/c++11/c++11-test-static_assert-N1720_fail_compile.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+ static_assert(1 < 0, "this should fail");
+ return 0;
+}
diff --git a/c++11/c++11-test-variadic_templates-N2555.cpp b/c++11/c++11-test-variadic_templates-N2555.cpp
new file mode 100644
index 0000000..79fae84
--- /dev/null
+++ b/c++11/c++11-test-variadic_templates-N2555.cpp
@@ -0,0 +1,23 @@
+int Accumulate()
+{
+ return 0;
+}
+
+template<typename T, typename... Ts>
+int Accumulate(T v, Ts... vs)
+{
+ return v + Accumulate(vs...);
+}
+
+template<int... Is>
+int CountElements()
+{
+ return sizeof...(Is);
+}
+
+int main()
+{
+ int acc = Accumulate(1, 2, 3, 4, -5);
+ int count = CountElements<1,2,3,4,5>();
+ return ((acc == 5) && (count == 5)) ? 0 : 1;
+}
diff --git a/c++11/demo.cpp b/c++11/demo.cpp
new file mode 100644
index 0000000..782681b
--- /dev/null
+++ b/c++11/demo.cpp
@@ -0,0 +1,23 @@
+
+#include <iostream>
+
+int main()
+{
+ std::cout << "Testing\n";
+ std::cout << "Has static_assert: " <<
+#ifdef HAS_CXX11_STATIC_ASSERT
+ "yes :)"
+#else
+ "no"
+#endif
+ << "\n";
+ std::cout << "Has variadic templates: " <<
+#ifdef HAS_CXX11_VARIADIC_TEMPLATES
+ "yes :)"
+#else
+ "no"
+#endif
+ << "\n";
+ return 0;
+}
+