+add_subdirectory(foundation)
add_subdirectory(core)
add_subdirectory(frontend)
--- /dev/null
+file(GLOB_RECURSE HEADERS "include/*.h")
+file(GLOB_RECURSE SOURCES "src/*.cpp")
+file(GLOB_RECURSE TESTS "src/*.test.cpp")
+list(REMOVE_ITEM SOURCES ${TESTS})
+
+add_nncc_library(nncc_foundation SHARED ${HEADERS} ${SOURCES})
+set_target_properties(nncc_foundation PROPERTIES LINKER_LANGUAGE CXX)
+target_include_directories(nncc_foundation PUBLIC include)
+
+add_nncc_test(nncc_foundation_test ${TESTS})
+nncc_test_link_libraries(nncc_foundation_test nncc_foundation)
--- /dev/null
+#ifndef __NNCC_FOUNDATION_MEMORY_H__
+#define __NNCC_FOUNDATION_MEMORY_H__
+
+#include <memory>
+
+namespace nncc
+{
+namespace foundation
+{
+
+template <typename T, typename... Args> std::unique_ptr<T> make_unique(Args &&... args)
+{
+ // NOTE std::make_unique is missing in C++11 standard
+ return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
+}
+
+} // namespace foundation
+} // namespace nncc
+
+#endif // __NNCC_FOUNDATION_MEMORY_H__
--- /dev/null
+#include <nncc/foundation/Memory.h>
+
+#include <gtest/gtest.h>
+
+class Tracker
+{
+public:
+ Tracker(bool &allocated, bool &freed) : _freed{freed} { allocated = true; }
+
+public:
+ ~Tracker() { _freed = true; }
+
+private:
+ bool &_freed;
+};
+
+TEST(FOUNDATION_MEMORY, unique_ptr)
+{
+ bool allocated = false;
+ bool freed = false;
+
+ {
+ auto o = nncc::foundation::make_unique<Tracker>(allocated, freed);
+
+ ASSERT_TRUE(allocated);
+ ASSERT_FALSE(freed);
+ }
+
+ ASSERT_TRUE(freed);
+}