From 4794e84c1372da34a4961505d6a809de0f07ab55 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 22 Nov 2017 16:34:02 +1100 Subject: [PATCH 01/56] build: prefer target specific includes and libs --- CMakeLists.txt | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dae941d7..14a94bb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,8 +29,6 @@ RAGEL_TARGET(json-flat json/flat.cpp.rl ${CMAKE_CURRENT_BINARY_DIR}/json/flat.cp RAGEL_TARGET(uri uri.cpp.rl ${CMAKE_CURRENT_BINARY_DIR}/uri.cpp) RAGEL_TARGET(version version.cpp.rl ${CMAKE_CURRENT_BINARY_DIR}/version.cpp) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - ############################################################################### set (UTIL_FILES) @@ -74,16 +72,6 @@ else () endif () -############################################################################### -# platform libraries -search_libs (SHM_LIBS shm_open rt) -search_libs (DL_LIBS dlopen dl) -search_libs (CLOCK_LIB clock_gettime rt c) -search_libs (MATH_LIB cos m) - -list (APPEND LIBS ${SHM_LIBS} ${DL_LIBS} ${CLOCK_LIB} ${MATH_LIB}) - - ############################################################################### # platform wrappers list ( @@ -415,9 +403,23 @@ list ( view.hpp ) + ############################################################################### add_library(cruft-util ${UTIL_FILES}) -target_link_libraries (cruft-util ${LIBS}) +target_link_libraries (cruft-util PUBLIC ${LIBS}) +target_include_directories(cruft-util PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") + +############################################################################### +# platform libraries +search_libs (SHM_LIBS shm_open rt) +search_libs (DL_LIBS dlopen dl) +search_libs (CLOCK_LIBS clock_gettime rt c) +search_libs (MATH_LIBS cos m) + +target_link_libraries(cruft-util PUBLIC ${SHM_LIBS}) +target_link_libraries(cruft-util PUBLIC ${DL_LIBS}) +target_link_libraries(cruft-util PUBLIC ${CLOCK_LIBS}) +target_link_libraries(cruft-util PUBLIC ${MATH_LIBS}) ############################################################################### @@ -425,6 +427,7 @@ foreach (tool hash json-clean json-schema json-validate scratch) add_executable (util_${tool} tools/${tool}.cpp) set_target_properties (util_${tool} PROPERTIES OUTPUT_NAME ${tool}) target_link_libraries (util_${tool} cruft-util) + target_include_directories(util_${tool} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) endforeach () @@ -512,6 +515,7 @@ if (TESTS) string(REPLACE "/" "_" name "test/${t}") add_executable(util_${name} test/${t}.cpp) target_link_libraries(util_${name} PRIVATE cruft-util) + target_include_directories(util_${name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) add_test(NAME util_${name} COMMAND util_${name}) endforeach(t) endif () From 34788756d2f2dc77ad29e0195efb5eb7061d298a Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 22 Nov 2017 16:49:37 +1100 Subject: [PATCH 02/56] build: don't use './' as an include prefix GCC produces ODR error when including paths of the form './foo' and 'foo' in the same binary. Rather than managing duplication we just universally pick the absolute form over the relative form. --- algo/sort.hpp | 2 +- alloc/affix.cpp | 2 +- alloc/allocator.cpp | 2 +- alloc/allocator.hpp | 2 +- alloc/arena.cpp | 2 +- alloc/arena.hpp | 2 +- alloc/fallback.cpp | 2 +- alloc/linear.cpp | 2 +- alloc/malloc.cpp | 2 +- alloc/null.cpp | 2 +- alloc/stack.cpp | 2 +- ascii.hpp | 2 +- backtrace_execinfo.cpp | 8 ++++---- backtrace_stackwalk.cpp | 8 ++++---- backtrace_win32.cpp | 8 ++++---- bezier.cpp | 10 +++++----- bezier1.cpp | 2 +- bezier2.cpp | 6 +++--- bezier3.cpp | 2 +- cast.hpp | 2 +- cmdopt.cpp | 6 +++--- cmdopt.ipp | 4 ++-- colour.cpp | 10 +++++----- coord/ops.hpp | 4 ++-- crypto/ice.cpp | 2 +- debug.hpp | 4 ++-- debug.ipp | 2 +- debug_posix.cpp | 6 +++--- debug_win32.cpp | 8 ++++---- except.cpp | 6 +++--- exe_linux.cpp | 6 +++--- exe_win32.cpp | 2 +- extent.cpp | 6 +++--- fixed.hpp | 6 +++--- fixup/experimental/filesystem | 2 +- fixup/experimental/filesystem.cpp | 2 +- format.ipp | 6 +++--- geom/aabb.cpp | 4 ++-- geom/iostream.cpp | 4 ++-- geom/iostream.hpp | 2 +- geom/ray.cpp | 6 +++--- hash/adler.cpp | 4 ++-- hash/adler.hpp | 2 +- hash/crc.cpp | 2 +- hash/fletcher.cpp | 2 +- hash/fwd.hpp | 6 +++--- hash/keccak.cpp | 2 +- hash/murmur.hpp | 6 +++--- hash/murmur/murmur2.hpp | 2 +- hash/ripemd.cpp | 2 +- hash/sha1.cpp | 2 +- hash/simple.cpp | 2 +- hash/xxhash.cpp | 8 ++++---- introspection.hpp | 4 ++-- io.hpp | 6 +++--- io_posix.cpp | 2 +- io_posix.ipp | 2 +- io_win32.cpp | 6 +++--- io_win32.hpp | 6 +++--- json/schema.cpp | 6 +++--- json/schema.hpp | 2 +- json/tree.cpp | 6 +++--- json/tree.hpp | 4 ++-- log.hpp | 4 ++-- maths.hpp | 4 ++-- matrix3.cpp | 2 +- memory/buffer/circular.cpp | 2 +- memory/buffer/paged.cpp | 2 +- memory/deleter.cpp | 2 +- memory/system.cpp | 2 +- point.cpp | 4 ++-- pool.ipp | 4 ++-- posix/dir.cpp | 2 +- posix/dir.hpp | 2 +- posix/fd.cpp | 2 +- posix/map.hpp | 2 +- quaternion.cpp | 6 +++--- quaternion.hpp | 2 +- rand/mwc64x.cpp | 2 +- rand/xorshift.cpp | 2 +- region.cpp | 6 +++--- sarray.cpp | 2 +- sarray.hpp | 2 +- string.cpp | 2 +- string.hpp | 2 +- strongdef.cpp | 2 +- term.cpp | 4 ++-- test/exe.cpp | 4 ++-- test/geom/ray.cpp | 8 ++++---- test/iterator.cpp | 4 ++-- test/pool.cpp | 4 ++-- test/stream.cpp | 4 ++-- test/typeidx.cpp | 4 ++-- time.cpp | 4 ++-- time.hpp | 5 +++-- time_posix.cpp | 4 ++-- typeidx.cpp | 2 +- vector.ipp | 2 +- view.cpp | 2 +- view.hpp | 4 ++-- view.ipp | 5 +++-- win32/handle.cpp | 2 +- 102 files changed, 189 insertions(+), 187 deletions(-) diff --git a/algo/sort.hpp b/algo/sort.hpp index 008a40c1..09c07037 100644 --- a/algo/sort.hpp +++ b/algo/sort.hpp @@ -44,6 +44,6 @@ namespace cruft::util::sort { soa (RandomIt key_first, RandomIt key_last, Comparator comp, Args ...values); } -#include "./sort.ipp" +#include "sort.ipp" #endif diff --git a/alloc/affix.cpp b/alloc/affix.cpp index 87f37ba4..26ebd72d 100644 --- a/alloc/affix.cpp +++ b/alloc/affix.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./affix.hpp" +#include "affix.hpp" using util::alloc::affix; diff --git a/alloc/allocator.cpp b/alloc/allocator.cpp index 0747499b..6b898bc5 100644 --- a/alloc/allocator.cpp +++ b/alloc/allocator.cpp @@ -1 +1 @@ -#include "./allocator.hpp" +#include "allocator.hpp" diff --git a/alloc/allocator.hpp b/alloc/allocator.hpp index cca7cfc6..1b4babc0 100644 --- a/alloc/allocator.hpp +++ b/alloc/allocator.hpp @@ -38,6 +38,6 @@ namespace util::alloc { }; } -#include "./allocator.ipp" +#include "allocator.ipp" #endif diff --git a/alloc/arena.cpp b/alloc/arena.cpp index ca065a58..a29f7c79 100644 --- a/alloc/arena.cpp +++ b/alloc/arena.cpp @@ -1 +1 @@ -#include "./arena.hpp" +#include "arena.hpp" diff --git a/alloc/arena.hpp b/alloc/arena.hpp index a61939bb..ddfe9663 100644 --- a/alloc/arena.hpp +++ b/alloc/arena.hpp @@ -66,6 +66,6 @@ namespace util::alloc { }; } -#include "./arena.ipp" +#include "arena.ipp" #endif diff --git a/alloc/fallback.cpp b/alloc/fallback.cpp index 76435d99..fa2fe52e 100644 --- a/alloc/fallback.cpp +++ b/alloc/fallback.cpp @@ -1 +1 @@ -#include "./fallback.hpp" +#include "fallback.hpp" diff --git a/alloc/linear.cpp b/alloc/linear.cpp index cd61b5a3..07f03416 100644 --- a/alloc/linear.cpp +++ b/alloc/linear.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./linear.hpp" +#include "linear.hpp" #include "../pointer.hpp" #include "../debug.hpp" diff --git a/alloc/malloc.cpp b/alloc/malloc.cpp index cc5afd1e..072b1892 100644 --- a/alloc/malloc.cpp +++ b/alloc/malloc.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./malloc.hpp" +#include "malloc.hpp" #include "../debug.hpp" diff --git a/alloc/null.cpp b/alloc/null.cpp index 7e041fa6..4dc80c02 100644 --- a/alloc/null.cpp +++ b/alloc/null.cpp @@ -15,7 +15,7 @@ */ -#include "./null.hpp" +#include "null.hpp" #include "../debug.hpp" diff --git a/alloc/stack.cpp b/alloc/stack.cpp index 3956fd65..95f8a7c2 100644 --- a/alloc/stack.cpp +++ b/alloc/stack.cpp @@ -14,7 +14,7 @@ * Copyright 2015-2016 Danny Robson */ -#include "./stack.hpp" +#include "stack.hpp" #include "../debug.hpp" #include "../pointer.hpp" diff --git a/ascii.hpp b/ascii.hpp index 5f13b77f..61e16bcf 100644 --- a/ascii.hpp +++ b/ascii.hpp @@ -17,7 +17,7 @@ #ifndef __CRUFT_UTIL_ASCII_HPP #define __CRUFT_UTIL_ASCII_HPP -#include "./annotation.hpp" +#include "annotation.hpp" #include #include diff --git a/backtrace_execinfo.cpp b/backtrace_execinfo.cpp index 4bb0c8d4..0c93ecf8 100644 --- a/backtrace_execinfo.cpp +++ b/backtrace_execinfo.cpp @@ -17,10 +17,10 @@ #include "backtrace.hpp" -#include "./debug.hpp" -#include "./exe.hpp" -#include "./io.hpp" -#include "./cast.hpp" +#include "debug.hpp" +#include "exe.hpp" +#include "io.hpp" +#include "cast.hpp" #include #include diff --git a/backtrace_stackwalk.cpp b/backtrace_stackwalk.cpp index d744877e..2cd14020 100644 --- a/backtrace_stackwalk.cpp +++ b/backtrace_stackwalk.cpp @@ -14,11 +14,11 @@ * Copyright 2016 Danny Robson */ -#include "./backtrace.hpp" +#include "backtrace.hpp" -#include "./debug.hpp" -#include "./except.hpp" -#include "./types.hpp" +#include "debug.hpp" +#include "except.hpp" +#include "types.hpp" #include #include diff --git a/backtrace_win32.cpp b/backtrace_win32.cpp index ae5470a0..378ac7c6 100644 --- a/backtrace_win32.cpp +++ b/backtrace_win32.cpp @@ -15,11 +15,11 @@ * 2012-2016, Danny Robson */ -#include "./backtrace.hpp" +#include "backtrace.hpp" -#include "./win32/handle.hpp" -#include "./debug.hpp" -#include "./except.hpp" +#include "win32/handle.hpp" +#include "debug.hpp" +#include "except.hpp" #include #include diff --git a/bezier.cpp b/bezier.cpp index 0966a416..b02319ea 100644 --- a/bezier.cpp +++ b/bezier.cpp @@ -14,12 +14,12 @@ * Copyright 2015-2016 Danny Robson */ -#include "./bezier.hpp" +#include "bezier.hpp" -#include "./debug.hpp" -#include "./polynomial.hpp" -#include "./stream.hpp" -#include "./coord/iostream.hpp" +#include "debug.hpp" +#include "polynomial.hpp" +#include "stream.hpp" +#include "coord/iostream.hpp" #include #include diff --git a/bezier1.cpp b/bezier1.cpp index b645fbd4..97c280ea 100644 --- a/bezier1.cpp +++ b/bezier1.cpp @@ -14,7 +14,7 @@ * Copyright 2015-2016 Danny Robson */ -#include "./bezier.hpp" +#include "bezier.hpp" #include #include diff --git a/bezier2.cpp b/bezier2.cpp index cb252207..9e6619a2 100644 --- a/bezier2.cpp +++ b/bezier2.cpp @@ -14,10 +14,10 @@ * Copyright 2015-2016 Danny Robson */ -#include "./bezier.hpp" +#include "bezier.hpp" -#include "./polynomial.hpp" -#include "./coord/iostream.hpp" +#include "polynomial.hpp" +#include "coord/iostream.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/bezier3.cpp b/bezier3.cpp index f34c7452..0721b924 100644 --- a/bezier3.cpp +++ b/bezier3.cpp @@ -14,7 +14,7 @@ * Copyright 2015-2016 Danny Robson */ -#include "./bezier.hpp" +#include "bezier.hpp" #include "coord/iostream.hpp" diff --git a/cast.hpp b/cast.hpp index 6afc863b..f477c936 100644 --- a/cast.hpp +++ b/cast.hpp @@ -17,7 +17,7 @@ #ifndef __UTIL_CAST_HPP #define __UTIL_CAST_HPP -#include "./debug.hpp" +#include "debug.hpp" #include #include diff --git a/cmdopt.cpp b/cmdopt.cpp index 451e5739..875d9d27 100644 --- a/cmdopt.cpp +++ b/cmdopt.cpp @@ -14,10 +14,10 @@ * Copyright 2013-2016 Danny Robson */ -#include "./cmdopt.hpp" +#include "cmdopt.hpp" -#include "./cast.hpp" -#include "./debug.hpp" +#include "cast.hpp" +#include "debug.hpp" #include #include diff --git a/cmdopt.ipp b/cmdopt.ipp index 047c397a..4153b850 100644 --- a/cmdopt.ipp +++ b/cmdopt.ipp @@ -23,8 +23,8 @@ #include #include -#include "./introspection.hpp" -#include "./iterator.hpp" +#include "introspection.hpp" +#include "iterator.hpp" namespace util::cmdopt { /////////////////////////////////////////////////////////////////////////// diff --git a/colour.cpp b/colour.cpp index ff11cb4b..a38567fb 100644 --- a/colour.cpp +++ b/colour.cpp @@ -14,12 +14,12 @@ * Copyright 2010-2017 Danny Robson */ -#include "./colour.hpp" +#include "colour.hpp" -#include "./ascii.hpp" -#include "./debug.hpp" -#include "./log.hpp" -#include "./range.hpp" +#include "ascii.hpp" +#include "debug.hpp" +#include "log.hpp" +#include "range.hpp" #include #include diff --git a/coord/ops.hpp b/coord/ops.hpp index 52cab527..9d6a36ab 100644 --- a/coord/ops.hpp +++ b/coord/ops.hpp @@ -11,13 +11,13 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * Copyright 2012-2016 Danny Robson + * Copyright 2012-2017 Danny Robson */ #ifndef __UTIL_COORDS_OPS #define __UTIL_COORDS_OPS -#include "./fwd.hpp" +#include "fwd.hpp" #include "../debug.hpp" #include "../maths.hpp" diff --git a/crypto/ice.cpp b/crypto/ice.cpp index ac5f2501..31dcf769 100644 --- a/crypto/ice.cpp +++ b/crypto/ice.cpp @@ -21,7 +21,7 @@ // Software Encryption - Fourth International Workshop, Haifa, Israel, // Springer-Verlag, pp. 69-82, 1997 -#include "./ice.hpp" +#include "ice.hpp" #include "../endian.hpp" #include "../debug.hpp" diff --git a/debug.hpp b/debug.hpp index e111ce48..82ca9585 100644 --- a/debug.hpp +++ b/debug.hpp @@ -391,14 +391,14 @@ namespace util::debug { } -#include "./debug.ipp" +#include "debug.ipp" /////////////////////////////////////////////////////////////////////////////// // XXX: maths needs to be included so that CHECK_EQ/NEQ can call almost_equal, // but maths.hpp might be using CHECK_ macros so we must include maths.hpp // after we define the CHECK_ macros so the preprocessor can resolve them. -#include "./maths.hpp" +#include "maths.hpp" #endif // __DEBUG_HPP diff --git a/debug.ipp b/debug.ipp index 5371c2e0..15da902a 100644 --- a/debug.ipp +++ b/debug.ipp @@ -20,7 +20,7 @@ #define __UTIL_DEBUG_IPP -#include "./format.hpp" +#include "format.hpp" #include diff --git a/debug_posix.cpp b/debug_posix.cpp index 12348312..93db5332 100644 --- a/debug_posix.cpp +++ b/debug_posix.cpp @@ -15,16 +15,16 @@ * 2011-2016, Danny Robson */ -#include "./debug.hpp" +#include "debug.hpp" -#include "./log.hpp" +#include "log.hpp" +#include "platform.hpp" #include #include #include #include -#include "./platform.hpp" #if defined(PLATFORM_FREEBSD) #define PTRACE_ATTACH PT_ATTACH diff --git a/debug_win32.cpp b/debug_win32.cpp index 5f10357b..bc785ed0 100644 --- a/debug_win32.cpp +++ b/debug_win32.cpp @@ -14,11 +14,11 @@ * Copyright 2016 Danny Robson */ -#include "./debug.hpp" +#include "debug.hpp" -#include "./except.hpp" -#include "./log.hpp" -#include "./except.hpp" +#include "except.hpp" +#include "log.hpp" +#include "except.hpp" #include #include diff --git a/except.cpp b/except.cpp index d902c840..11887d50 100644 --- a/except.cpp +++ b/except.cpp @@ -14,10 +14,10 @@ * Copyright 2010 Danny Robson */ -#include "./except.hpp" +#include "except.hpp" -#include "./debug.hpp" -#include "./platform.hpp" +#include "debug.hpp" +#include "platform.hpp" #include #include diff --git a/exe_linux.cpp b/exe_linux.cpp index a7f02317..6a29de99 100644 --- a/exe_linux.cpp +++ b/exe_linux.cpp @@ -14,10 +14,10 @@ * Copyright 2010-2016 Danny Robson */ -#include "./exe.hpp" +#include "exe.hpp" -#include "./except.hpp" -#include "./cast.hpp" +#include "except.hpp" +#include "cast.hpp" #include #include diff --git a/exe_win32.cpp b/exe_win32.cpp index ca0f832e..b67f69d9 100644 --- a/exe_win32.cpp +++ b/exe_win32.cpp @@ -14,7 +14,7 @@ * Copyright 2010-2016 Danny Robson */ -#include "./exe.hpp" +#include "exe.hpp" #include "except.hpp" diff --git a/extent.cpp b/extent.cpp index 03b4becb..5da4f70f 100644 --- a/extent.cpp +++ b/extent.cpp @@ -14,10 +14,10 @@ * Copyright 2010-2016 Danny Robson */ -#include "./extent.hpp" +#include "extent.hpp" -#include "./debug.hpp" -#include "./maths.hpp" +#include "debug.hpp" +#include "maths.hpp" #include #include diff --git a/fixed.hpp b/fixed.hpp index 5f6d7fca..7b025b7d 100644 --- a/fixed.hpp +++ b/fixed.hpp @@ -17,9 +17,9 @@ #ifndef __UTIL_FIXED_HPP #define __UTIL_FIXED_HPP -#include "./types/bits.hpp" -#include "./maths.hpp" -#include "./endian.hpp" +#include "types/bits.hpp" +#include "maths.hpp" +#include "endian.hpp" #include diff --git a/fixup/experimental/filesystem b/fixup/experimental/filesystem index 375196f7..b342cdce 100644 --- a/fixup/experimental/filesystem +++ b/fixup/experimental/filesystem @@ -1 +1 @@ -#include "./filesystem.hpp" +#include "filesystem.hpp" diff --git a/fixup/experimental/filesystem.cpp b/fixup/experimental/filesystem.cpp index 4ad7156f..bd890218 100644 --- a/fixup/experimental/filesystem.cpp +++ b/fixup/experimental/filesystem.cpp @@ -14,7 +14,7 @@ * Copyright 2016 Danny Robson */ -#include "./filesystem.hpp" +#include "filesystem.hpp" #include "../../except.hpp" diff --git a/format.ipp b/format.ipp index a8258323..1d0048d5 100644 --- a/format.ipp +++ b/format.ipp @@ -14,9 +14,9 @@ * Copyright 2015-2016 Danny Robson */ -#include "./ascii.hpp" -#include "./debug.hpp" -#include "./maths.hpp" +#include "ascii.hpp" +#include "debug.hpp" +#include "maths.hpp" #include #include diff --git a/geom/aabb.cpp b/geom/aabb.cpp index b2601671..2aa1052a 100644 --- a/geom/aabb.cpp +++ b/geom/aabb.cpp @@ -15,9 +15,9 @@ */ -#include "./aabb.hpp" +#include "aabb.hpp" -#include "./iostream.hpp" +#include "iostream.hpp" #include "../coord/iostream.hpp" #include "../debug.hpp" diff --git a/geom/iostream.cpp b/geom/iostream.cpp index bc5add01..625b30e4 100644 --- a/geom/iostream.cpp +++ b/geom/iostream.cpp @@ -14,9 +14,9 @@ * Copyright 2015 Danny Robson */ -#include "./iostream.hpp" +#include "iostream.hpp" -#include "./sphere.hpp" +#include "sphere.hpp" #include "../coord/iostream.hpp" diff --git a/geom/iostream.hpp b/geom/iostream.hpp index 507aecab..ffe348b9 100644 --- a/geom/iostream.hpp +++ b/geom/iostream.hpp @@ -17,7 +17,7 @@ #ifndef __UTIL_GEOM_IOSTREAM_HPP #define __UTIL_GEOM_IOSTREAM_HPP -#include "./fwd.hpp" +#include "fwd.hpp" #include diff --git a/geom/ray.cpp b/geom/ray.cpp index 41fa0d76..60252f1d 100644 --- a/geom/ray.cpp +++ b/geom/ray.cpp @@ -14,10 +14,10 @@ * Copyright 2015 Danny Robson */ -#include "./ray.hpp" +#include "ray.hpp" -#include "./iostream.hpp" -#include "./ops.hpp" +#include "iostream.hpp" +#include "ops.hpp" #include "../coord/iostream.hpp" #include "../debug.hpp" diff --git a/hash/adler.cpp b/hash/adler.cpp index 8a1102ec..d9f93dbe 100644 --- a/hash/adler.cpp +++ b/hash/adler.cpp @@ -14,9 +14,9 @@ * Copyright 2010-2014 Danny Robson */ -#include "./adler.hpp" +#include "adler.hpp" -#include "./fletcher.hpp" +#include "fletcher.hpp" #include "../debug.hpp" static constexpr unsigned MODULUS = 65521; diff --git a/hash/adler.hpp b/hash/adler.hpp index f233ecd7..37bb6fe3 100644 --- a/hash/adler.hpp +++ b/hash/adler.hpp @@ -17,7 +17,7 @@ #ifndef __UTIL_HASH_ADLER_HPP #define __UTIL_HASH_ADLER_HPP -#include "./fletcher.hpp" +#include "fletcher.hpp" #include diff --git a/hash/crc.cpp b/hash/crc.cpp index 38398e67..ebefc88b 100644 --- a/hash/crc.cpp +++ b/hash/crc.cpp @@ -14,7 +14,7 @@ * Copyright 2011 Danny Robson */ -#include "./crc.hpp" +#include "crc.hpp" #include "../bitwise.hpp" #include "../debug.hpp" diff --git a/hash/fletcher.cpp b/hash/fletcher.cpp index a29dac95..e8a05125 100644 --- a/hash/fletcher.cpp +++ b/hash/fletcher.cpp @@ -15,7 +15,7 @@ */ -#include "./fletcher.hpp" +#include "fletcher.hpp" #include "../debug.hpp" diff --git a/hash/fwd.hpp b/hash/fwd.hpp index b4fd9bee..90c97b43 100644 --- a/hash/fwd.hpp +++ b/hash/fwd.hpp @@ -21,9 +21,9 @@ // directly, and are unlikely to change given their inherent // lightweight nature. -#include "./fasthash.hpp" -#include "./fnv1a.hpp" -#include "./murmur.hpp" +#include "fasthash.hpp" +#include "fnv1a.hpp" +#include "murmur.hpp" // Forward declerations of class based hashes diff --git a/hash/keccak.cpp b/hash/keccak.cpp index 224c4116..c0936fec 100644 --- a/hash/keccak.cpp +++ b/hash/keccak.cpp @@ -1,4 +1,4 @@ -#include "./keccak.hpp" +#include "keccak.hpp" #include "../endian.hpp" #include "../maths.hpp" diff --git a/hash/murmur.hpp b/hash/murmur.hpp index 6d774264..6a4d5931 100644 --- a/hash/murmur.hpp +++ b/hash/murmur.hpp @@ -17,8 +17,8 @@ #ifndef __UTIL_HASH_MURMUR_HPP #define __UTIL_HASH_MURMUR_HPP -#include "./murmur/murmur1.hpp" -#include "./murmur/murmur2.hpp" -#include "./murmur/murmur3.hpp" +#include "murmur/murmur1.hpp" +#include "murmur/murmur2.hpp" +#include "murmur/murmur3.hpp" #endif diff --git a/hash/murmur/murmur2.hpp b/hash/murmur/murmur2.hpp index 721e148c..6f41da26 100644 --- a/hash/murmur/murmur2.hpp +++ b/hash/murmur/murmur2.hpp @@ -31,7 +31,7 @@ namespace util::hash::murmur2 { uint64_t hash_64 (const void *restrict data, size_t len, uint64_t seed); } -#include "./murmur2.ipp" +#include "murmur2.ipp" #endif diff --git a/hash/ripemd.cpp b/hash/ripemd.cpp index 369561a2..49510100 100644 --- a/hash/ripemd.cpp +++ b/hash/ripemd.cpp @@ -15,7 +15,7 @@ * 2014, Danny Robson */ -#include "./ripemd.hpp" +#include "ripemd.hpp" #include "../debug.hpp" #include "../bitwise.hpp" diff --git a/hash/sha1.cpp b/hash/sha1.cpp index 3f26a780..331056ad 100644 --- a/hash/sha1.cpp +++ b/hash/sha1.cpp @@ -14,7 +14,7 @@ * Copyright 2013 Danny Robson */ -#include "./sha1.hpp" +#include "sha1.hpp" #include "../bitwise.hpp" #include "../debug.hpp" diff --git a/hash/simple.cpp b/hash/simple.cpp index 20ee090a..22eb18a3 100644 --- a/hash/simple.cpp +++ b/hash/simple.cpp @@ -14,4 +14,4 @@ * Copyright 2016, Danny Robson */ -#include "./simple.hpp" +#include "simple.hpp" diff --git a/hash/xxhash.cpp b/hash/xxhash.cpp index 465cc640..87767f0f 100644 --- a/hash/xxhash.cpp +++ b/hash/xxhash.cpp @@ -14,11 +14,11 @@ * Copyright 2016 Danny Robson */ -#include "./xxhash.hpp" +#include "xxhash.hpp" -#include "./debug.hpp" -#include "./bitwise.hpp" -#include "./endian.hpp" +#include "../bitwise.hpp" +#include "../debug.hpp" +#include "../endian.hpp" using util::hash::xxhash; diff --git a/introspection.hpp b/introspection.hpp index 4aeab3f6..38bff553 100644 --- a/introspection.hpp +++ b/introspection.hpp @@ -17,8 +17,8 @@ #ifndef __UTIL_INTROSPECTION_HPP #define __UTIL_INTROSPECTION_HPP -#include "./preprocessor.hpp" -#include "./variadic.hpp" +#include "preprocessor.hpp" +#include "variadic.hpp" #include #include diff --git a/io.hpp b/io.hpp index 521109b5..36cd14e2 100644 --- a/io.hpp +++ b/io.hpp @@ -116,11 +116,11 @@ namespace util { } #ifdef PLATFORM_WIN32 -#include "./io_win32.hpp" +#include "io_win32.hpp" #else -#include "./io_posix.hpp" +#include "io_posix.hpp" #endif -#include "./io.ipp" +#include "io.ipp" #endif diff --git a/io_posix.cpp b/io_posix.cpp index f4b612d0..9bca4ce4 100644 --- a/io_posix.cpp +++ b/io_posix.cpp @@ -16,10 +16,10 @@ #include "io.hpp" +#include "cast.hpp" #include "debug.hpp" #include "except.hpp" #include "posix/fd.hpp" -#include "./cast.hpp" #include diff --git a/io_posix.ipp b/io_posix.ipp index d6814682..2e66c300 100644 --- a/io_posix.ipp +++ b/io_posix.ipp @@ -20,7 +20,7 @@ #define __UTIL_IO_POSIX_IPP -#include "./pointer.hpp" +#include "pointer.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/io_win32.cpp b/io_win32.cpp index 521c2fdd..bd08b1a2 100644 --- a/io_win32.cpp +++ b/io_win32.cpp @@ -14,10 +14,10 @@ * Copyright 2014 Danny Robson */ -#include "./io_win32.hpp" +#include "io_win32.hpp" -#include "./debug.hpp" -#include "./except.hpp" +#include "debug.hpp" +#include "except.hpp" #include diff --git a/io_win32.hpp b/io_win32.hpp index 079da417..eef0e3b8 100644 --- a/io_win32.hpp +++ b/io_win32.hpp @@ -17,9 +17,9 @@ #ifndef __UTIL_IO_WIN32_HPP #define __UTIL_IO_WIN32_HPP -#include "./io.hpp" -#include "./win32/handle.hpp" -#include "./view.hpp" +#include "io.hpp" +#include "win32/handle.hpp" +#include "view.hpp" #include #include diff --git a/json/schema.cpp b/json/schema.cpp index 172c1de6..aff1afc0 100644 --- a/json/schema.cpp +++ b/json/schema.cpp @@ -14,10 +14,10 @@ * Copyright 2015 Danny Robson */ -#include "./schema.hpp" +#include "schema.hpp" -#include "./tree.hpp" -#include "./except.hpp" +#include "tree.hpp" +#include "except.hpp" #include "../io.hpp" #include "../maths.hpp" diff --git a/json/schema.hpp b/json/schema.hpp index 6522d85c..4398bf1d 100644 --- a/json/schema.hpp +++ b/json/schema.hpp @@ -17,7 +17,7 @@ #ifndef __UTIL_JSON_SCHEMA_HPP #define __UTIL_JSON_SCHEMA_HPP -#include "./fwd.hpp" +#include "fwd.hpp" #include diff --git a/json/tree.cpp b/json/tree.cpp index 770511cb..40b4055f 100644 --- a/json/tree.cpp +++ b/json/tree.cpp @@ -15,10 +15,10 @@ */ -#include "./tree.hpp" +#include "tree.hpp" -#include "./except.hpp" -#include "./flat.hpp" +#include "except.hpp" +#include "flat.hpp" #include "../debug.hpp" #include "../io.hpp" diff --git a/json/tree.hpp b/json/tree.hpp index 8cf3708f..1ac06a3e 100644 --- a/json/tree.hpp +++ b/json/tree.hpp @@ -17,8 +17,8 @@ #ifndef __UTIL_JSON_TREE_HPP #define __UTIL_JSON_TREE_HPP -#include "./flat.hpp" -#include "./fwd.hpp" +#include "flat.hpp" +#include "fwd.hpp" #include "../iterator.hpp" #include "../view.hpp" diff --git a/log.hpp b/log.hpp index aa30788c..b41ee7af 100644 --- a/log.hpp +++ b/log.hpp @@ -17,8 +17,8 @@ #ifndef __UTIL_LOG_HPP #define __UTIL_LOG_HPP -#include "./nocopy.hpp" -#include "./preprocessor.hpp" +#include "nocopy.hpp" +#include "preprocessor.hpp" #include #include diff --git a/maths.hpp b/maths.hpp index 9e8e9f35..5ad376bc 100644 --- a/maths.hpp +++ b/maths.hpp @@ -21,8 +21,8 @@ // it triggers a circular dependency; debug -> format -> maths -> debug // instead, just use cassert -#include "./types/traits.hpp" -#include "./float.hpp" +#include "types/traits.hpp" +#include "float.hpp" #include #include diff --git a/matrix3.cpp b/matrix3.cpp index 64b0b678..d4398a20 100644 --- a/matrix3.cpp +++ b/matrix3.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./matrix.hpp" +#include "matrix.hpp" using util::matrix; diff --git a/memory/buffer/circular.cpp b/memory/buffer/circular.cpp index 457db4fe..a091a667 100644 --- a/memory/buffer/circular.cpp +++ b/memory/buffer/circular.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./circular.hpp" +#include "circular.hpp" #include "../system.hpp" #include "../../debug.hpp" diff --git a/memory/buffer/paged.cpp b/memory/buffer/paged.cpp index 5d937e90..3a141de7 100644 --- a/memory/buffer/paged.cpp +++ b/memory/buffer/paged.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./paged.hpp" +#include "paged.hpp" #include "../system.hpp" #include "../../except.hpp" diff --git a/memory/deleter.cpp b/memory/deleter.cpp index 9ec8d645..9b30b0e6 100644 --- a/memory/deleter.cpp +++ b/memory/deleter.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./deleter.hpp" +#include "deleter.hpp" using util::memory::owner_deleter; diff --git a/memory/system.cpp b/memory/system.cpp index a06b610b..acf4eefb 100644 --- a/memory/system.cpp +++ b/memory/system.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./system.hpp" +#include "system.hpp" #include "../except.hpp" #include "../cast.hpp" diff --git a/point.cpp b/point.cpp index fc1bef83..bbda9bc6 100644 --- a/point.cpp +++ b/point.cpp @@ -14,9 +14,9 @@ * Copyright 2011-2016 Danny Robson */ -#include "./point.hpp" +#include "point.hpp" -#include "./debug.hpp" +#include "debug.hpp" #include diff --git a/pool.ipp b/pool.ipp index ea02ac98..34a53f1f 100644 --- a/pool.ipp +++ b/pool.ipp @@ -20,12 +20,12 @@ #define __UTIL_POOL_IPP +#include "debug.hpp" + #include #include #include -#include "./debug.hpp" - namespace util { //------------------------------------------------------------------------- diff --git a/posix/dir.cpp b/posix/dir.cpp index 2c48ad6c..e8e3fce6 100644 --- a/posix/dir.cpp +++ b/posix/dir.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./dir.hpp" +#include "dir.hpp" #include "../except.hpp" diff --git a/posix/dir.hpp b/posix/dir.hpp index d27d6d68..8476a12e 100644 --- a/posix/dir.hpp +++ b/posix/dir.hpp @@ -48,6 +48,6 @@ namespace util::posix { }; } -#include "./dir.ipp" +#include "dir.ipp" #endif diff --git a/posix/fd.cpp b/posix/fd.cpp index 8d16dbc4..9bee1779 100644 --- a/posix/fd.cpp +++ b/posix/fd.cpp @@ -14,7 +14,7 @@ * Copyright 2016 Danny Robson */ -#include "./fd.hpp" +#include "fd.hpp" #include "../except.hpp" diff --git a/posix/map.hpp b/posix/map.hpp index b3a51e9b..33fbd133 100644 --- a/posix/map.hpp +++ b/posix/map.hpp @@ -17,7 +17,7 @@ #ifndef __CRUFT_UTIL_POSIX_HPP #define __CRUFT_UTIL_POSIX_HPP -#include "./fd.hpp" +#include "fd.hpp" #include #include diff --git a/quaternion.cpp b/quaternion.cpp index b868aa60..3d0d7975 100644 --- a/quaternion.cpp +++ b/quaternion.cpp @@ -15,10 +15,10 @@ */ -#include "./quaternion.hpp" +#include "quaternion.hpp" -#include "./debug.hpp" -#include "./vector.hpp" +#include "debug.hpp" +#include "vector.hpp" #include diff --git a/quaternion.hpp b/quaternion.hpp index d1897ea8..52eea91a 100644 --- a/quaternion.hpp +++ b/quaternion.hpp @@ -126,6 +126,6 @@ namespace util { operator<< (std::ostream&, quaternion); } -#include "./quaternion.ipp" +#include "quaternion.ipp" #endif diff --git a/rand/mwc64x.cpp b/rand/mwc64x.cpp index 07aaaf3c..0a0a2274 100644 --- a/rand/mwc64x.cpp +++ b/rand/mwc64x.cpp @@ -15,7 +15,7 @@ */ -#include "./mwc64x.hpp" +#include "mwc64x.hpp" #include "../debug.hpp" diff --git a/rand/xorshift.cpp b/rand/xorshift.cpp index df1f1c42..d38c42b0 100644 --- a/rand/xorshift.cpp +++ b/rand/xorshift.cpp @@ -14,7 +14,7 @@ * Copyright 2015-2016 Danny Robson */ -#include "./xorshift.hpp" +#include "xorshift.hpp" #include "../debug.hpp" diff --git a/region.cpp b/region.cpp index df6b3a5b..39def184 100644 --- a/region.cpp +++ b/region.cpp @@ -15,11 +15,11 @@ */ -#include "./region.hpp" +#include "region.hpp" -#include "./debug.hpp" +#include "debug.hpp" -#include "./coord/iostream.hpp" +#include "coord/iostream.hpp" #include diff --git a/sarray.cpp b/sarray.cpp index 287fb71c..2aad7134 100644 --- a/sarray.cpp +++ b/sarray.cpp @@ -14,4 +14,4 @@ * Copyright 2017 Danny Robson */ -#include "./sarray.hpp" +#include "sarray.hpp" diff --git a/sarray.hpp b/sarray.hpp index 377deeb5..57b6f359 100644 --- a/sarray.hpp +++ b/sarray.hpp @@ -17,7 +17,7 @@ #ifndef CRUFT_UTIL_SARRAY_HPP #define CRUFT_UTIL_SARRAY_HPP -#include "./iterator.hpp" +#include "iterator.hpp" #include #include diff --git a/string.cpp b/string.cpp index 34423493..8367347a 100644 --- a/string.cpp +++ b/string.cpp @@ -14,7 +14,7 @@ * Copyright 2011-2016 Danny Robson */ -#include "./string.hpp" +#include "string.hpp" #include #include diff --git a/string.hpp b/string.hpp index d7c9434e..c93f809a 100644 --- a/string.hpp +++ b/string.hpp @@ -17,7 +17,7 @@ #ifndef __UTIL_STRING_HPP #define __UTIL_STRING_HPP -#include "./view.hpp" +#include "view.hpp" namespace util { diff --git a/strongdef.cpp b/strongdef.cpp index 4d7a888c..1c591def 100644 --- a/strongdef.cpp +++ b/strongdef.cpp @@ -14,7 +14,7 @@ * Copyright 2015 Danny Robson */ -#include "./strongdef.hpp" +#include "strongdef.hpp" using util::strongdef; diff --git a/term.cpp b/term.cpp index 78ed2316..cbc87074 100644 --- a/term.cpp +++ b/term.cpp @@ -14,9 +14,9 @@ * Copyright 2016-2017 Danny Robson */ -#include "./term.hpp" +#include "term.hpp" -#include "./string.hpp" +#include "string.hpp" #include #include diff --git a/test/exe.cpp b/test/exe.cpp index 1f909382..8ab1c909 100644 --- a/test/exe.cpp +++ b/test/exe.cpp @@ -1,6 +1,6 @@ -#include "./tap.hpp" +#include "../tap.hpp" -#include "./exe.hpp" +#include "../exe.hpp" #include diff --git a/test/geom/ray.cpp b/test/geom/ray.cpp index 45d989e4..495cdb96 100644 --- a/test/geom/ray.cpp +++ b/test/geom/ray.cpp @@ -1,7 +1,7 @@ -#include "geom/aabb.hpp" -#include "geom/plane.hpp" -#include "geom/ray.hpp" -#include "tap.hpp" +#include "../../geom/aabb.hpp" +#include "../../geom/plane.hpp" +#include "../../geom/ray.hpp" +#include "../../tap.hpp" using util::geom::ray2f; using util::geom::ray3f; diff --git a/test/iterator.cpp b/test/iterator.cpp index 78760608..a1bc50a6 100644 --- a/test/iterator.cpp +++ b/test/iterator.cpp @@ -1,6 +1,6 @@ -#include "tap.hpp" +#include "../tap.hpp" -#include "./iterator.hpp" +#include "../iterator.hpp" #include #include diff --git a/test/pool.cpp b/test/pool.cpp index 81c412e4..b26809ee 100644 --- a/test/pool.cpp +++ b/test/pool.cpp @@ -1,6 +1,6 @@ -#include "pool.hpp" +#include "../pool.hpp" -#include "tap.hpp" +#include "../tap.hpp" #include #include diff --git a/test/stream.cpp b/test/stream.cpp index 320ef3ff..bce8204f 100644 --- a/test/stream.cpp +++ b/test/stream.cpp @@ -1,6 +1,6 @@ -#include "tap.hpp" +#include "../tap.hpp" -#include "stream.hpp" +#include "../stream.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/test/typeidx.cpp b/test/typeidx.cpp index ed3ae9bf..c6b26403 100644 --- a/test/typeidx.cpp +++ b/test/typeidx.cpp @@ -1,6 +1,6 @@ -#include "tap.hpp" +#include "../tap.hpp" -#include "./typeidx.hpp" +#include "../typeidx.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/time.cpp b/time.cpp index fba55178..6086b319 100644 --- a/time.cpp +++ b/time.cpp @@ -14,9 +14,9 @@ * Copyright 2010-2016 Danny Robson */ -#include "./time.hpp" +#include "time.hpp" -#include "./log.hpp" +#include "log.hpp" #include diff --git a/time.hpp b/time.hpp index 5fcca2b6..60c12b1a 100644 --- a/time.hpp +++ b/time.hpp @@ -17,11 +17,12 @@ #ifndef __UTIL_TIME_HPP #define __UTIL_TIME_HPP +#include "stats.hpp" + #include #include #include -#include "./stats.hpp" namespace util { // ------------------------------------------------------------------------ @@ -89,6 +90,6 @@ namespace util { }; } -#include "./time.ipp" +#include "time.ipp" #endif // __UTIL_TIME_HPP diff --git a/time_posix.cpp b/time_posix.cpp index 43b496b4..7805fad2 100644 --- a/time_posix.cpp +++ b/time_posix.cpp @@ -14,9 +14,9 @@ * Copyright 2010-2016 Danny Robson */ -#include "./time.hpp" +#include "time.hpp" -#include "./cast.hpp" +#include "cast.hpp" #include diff --git a/typeidx.cpp b/typeidx.cpp index 3231bd10..03b0fd59 100644 --- a/typeidx.cpp +++ b/typeidx.cpp @@ -14,7 +14,7 @@ * Copyright 2017 Danny Robson */ -#include "./typeidx.hpp" +#include "typeidx.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/vector.ipp b/vector.ipp index 5d2add75..a390fd7e 100644 --- a/vector.ipp +++ b/vector.ipp @@ -20,7 +20,7 @@ #define __UTIL_VECTOR_IPP #endif -#include "./maths.hpp" +#include "maths.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/view.cpp b/view.cpp index 40d011dd..1a4d49a2 100644 --- a/view.cpp +++ b/view.cpp @@ -14,7 +14,7 @@ * Copyright 2016 Danny Robson */ -#include "./view.hpp" +#include "view.hpp" #include diff --git a/view.hpp b/view.hpp index 4072e598..432757e3 100644 --- a/view.hpp +++ b/view.hpp @@ -18,7 +18,7 @@ #ifndef __UTIL_VIEW_HPP #define __UTIL_VIEW_HPP -#include "./types/traits.hpp" +#include "types/traits.hpp" #include #include @@ -133,6 +133,6 @@ namespace util { operator<< (std::ostream&, view); } -#include "./view.ipp" +#include "view.ipp" #endif diff --git a/view.ipp b/view.ipp index dc42b71b..e7e122c8 100644 --- a/view.ipp +++ b/view.ipp @@ -20,9 +20,10 @@ #endif #define __UTIL_VIEW_IPP +#include "view.hpp" -#include "./debug.hpp" -#include "./iterator.hpp" +#include "debug.hpp" +#include "iterator.hpp" /////////////////////////////////////////////////////////////////////////////// diff --git a/win32/handle.cpp b/win32/handle.cpp index 9fff2ec7..bfe73aa4 100644 --- a/win32/handle.cpp +++ b/win32/handle.cpp @@ -1,4 +1,4 @@ -#include "./handle.hpp" +#include "handle.hpp" #include "../except.hpp" From d3f434b523b4a6b41b1024fc993a86a0cd6f3683 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 22 Nov 2017 17:03:00 +1100 Subject: [PATCH 03/56] coord: make template parameters more flexible The coordinate system was unable to support types that prohibited redim or retype operations. Additionally, the `tags' type used for providing named data parameters was unwiedly. We remove much of the dependance on template template parameters in the defined operations and instead define these in terms of a template specialisation of is_coord. The tag types were replaced with direct specialisation of the `store' struct by the primary type, and passing this type through use of the CRTP. --- CMakeLists.txt | 2 +- colour.cpp | 450 -------------------------- colour.hpp | 138 ++++---- colour.ipp | 12 - coord/base.hpp | 83 +++-- coord/fwd.hpp | 15 +- coord/init.hpp | 34 +- coord/iostream.hpp | 4 +- coord/names.hpp | 42 --- coord/ops.hpp | 750 +++++++++++++++++++++++--------------------- coord/store.hpp | 230 +++++--------- coord/traits.hpp | 170 ++++++++++ extent.cpp | 6 +- extent.hpp | 32 +- geom/aabb.cpp | 86 ----- geom/aabb.hpp | 14 +- geom/plane.cpp | 3 +- geom/plane.hpp | 7 +- hash/bsdsum.cpp | 5 +- maths.hpp | 6 +- matrix.cpp | 115 +++---- matrix.hpp | 172 +++++++--- matrix.ipp | 104 +++--- matrix2.cpp | 12 +- matrix3.cpp | 26 +- matrix4.cpp | 135 ++++++-- point.hpp | 4 +- quaternion.hpp | 10 +- random.hpp | 40 ++- test/affine.cpp | 48 +-- test/colour.cpp | 76 +---- test/geom/aabb.cpp | 37 --- test/point.cpp | 5 + test/quaternion.cpp | 4 +- test/string.cpp | 11 +- vector.hpp | 4 +- view.cpp | 2 +- 37 files changed, 1296 insertions(+), 1598 deletions(-) delete mode 100644 coord/names.hpp create mode 100644 coord/traits.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 14a94bb7..08633272 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,9 +180,9 @@ list ( coord.hpp coord/init.hpp coord/iostream.hpp - coord/names.hpp coord/ops.hpp coord/store.hpp + coord/traits.hpp crypto/arc4.cpp crypto/arc4.hpp crypto/ice.cpp diff --git a/colour.cpp b/colour.cpp index a38567fb..1525606e 100644 --- a/colour.cpp +++ b/colour.cpp @@ -15,453 +15,3 @@ */ #include "colour.hpp" - -#include "ascii.hpp" -#include "debug.hpp" -#include "log.hpp" -#include "range.hpp" - -#include -#include - -/////////////////////////////////////////////////////////////////////////////// -using util::colour; -using util::colour3f; -using util::colour4f; - - -/////////////////////////////////////////////////////////////////////////////// -template -colour -colour::parse_html (const char *fmt) -{ - // ensure the format is the correct length - auto len = strlen (fmt); - - switch (len) { - case 1 + 2 * S: - if (*fmt != '#') - throw std::invalid_argument ("missing leading hash"); - ++fmt; - break; - - case 2 * S: - break; - - default: - throw std::invalid_argument ("format is the wrong length"); - } - - // parse the octets - util::colour res; - for (size_t i = 0; i < res.size (); ++i) { - auto a = util::ascii::from_hex (fmt[i*2+0]); - auto b = util::ascii::from_hex (fmt[i*2+1]); - - res[i] = (a << 4u) | b; - } - - return res.template cast (); -} - - -/////////////////////////////////////////////////////////////////////////////// -static const std::map> -HTML_COLOURS { { - { "white", { 0xff, 0xff, 0xff, 0xff } }, - { "silver", { 0xc0, 0xc0, 0xc0, 0xff } }, - { "gray", { 0x80, 0x80, 0x80, 0xff } }, - { "black", { 0x00, 0x00, 0x00, 0xff } }, - { "red", { 0xff, 0x00, 0x00, 0xff } }, - { "maroon", { 0x80, 0x00, 0x00, 0xff } }, - { "yellow", { 0xff, 0xff, 0x00, 0xff } }, - { "olive", { 0x80, 0x80, 0x00, 0xff } }, - { "lime", { 0x00, 0xff, 0x00, 0xff } }, - { "green", { 0x00, 0x80, 0x00, 0xff } }, - { "aqua", { 0x00, 0xff, 0xff, 0xff } }, - { "teal", { 0x00, 0x80, 0x80, 0xff } }, - { "blue", { 0x00, 0x00, 0xff, 0xff } }, - { "navy", { 0x00, 0x00, 0x80, 0xff } }, - { "fuchsia", { 0xff, 0x00, 0xff, 0xff } }, - { "purple", { 0x80, 0x00, 0x80, 0xff } }, -} }; - - -//----------------------------------------------------------------------------- -static const std::map> X11_COLOURS -{ - /* pink */ - { "pink", { 0xff, 0xc0, 0xcb, 0xff } }, - { "lightpink", { 0xff, 0xb6, 0xc1, 0xff } }, - { "hotpink", { 0xff, 0x69, 0xb4, 0xff } }, - { "deeppink", { 0xff, 0x14, 0x93, 0xff } }, - { "palevioletred", { 0xdb, 0x70, 0x93, 0xff } }, - { "mediumvioletred", { 0xc7, 0x15, 0x85, 0xff } }, - - /* red */ - { "lightsalmon", { 0xff, 0xa0, 0x7a, 0xff } }, - { "salmon", { 0xfa, 0x80, 0x72, 0xff } }, - { "darksalmon", { 0xe9, 0x96, 0x7a, 0xff } }, - { "lightcoral", { 0xf0, 0x80, 0x80, 0xff } }, - { "indianred", { 0xcd, 0x5c, 0x5c, 0xff } }, - { "crimson", { 0xdc, 0x14, 0x3c, 0xff } }, - { "firebrick", { 0xb2, 0x22, 0x22, 0xff } }, - { "darkred", { 0x8b, 0x00, 0x00, 0xff } }, - { "red", { 0xff, 0x00, 0x00, 0xff } }, - - /* orange */ - { "orangered", { 0xff, 0x45, 0x00, 0xff } }, - { "tomato", { 0xff, 0x63, 0x47, 0xff } }, - { "coral", { 0xff, 0x7f, 0x50, 0xff } }, - { "darkorange", { 0xff, 0x8c, 0x00, 0xff } }, - { "orange", { 0xff, 0xa5, 0x00, 0xff } }, - - /* yellow */ - { "yellow", { 0xff, 0xff, 0x00, 0xff } }, - { "lightyellow", { 0xff, 0xff, 0xe0, 0xff } }, - { "lemonchiffon", { 0xff, 0xfa, 0xcd, 0xff } }, - { "lightgoldenrodyellow", { 0xfa, 0xfa, 0xd2, 0xff } }, - { "papayawhip", { 0xff, 0xef, 0xd5, 0xff } }, - { "moccasin", { 0xff, 0xe4, 0xb5, 0xff } }, - { "peachpuff", { 0xff, 0xda, 0xb9, 0xff } }, - { "palegoldenrod", { 0xee, 0xe8, 0xaa, 0xff } }, - { "khaki", { 0xf0, 0xe6, 0x8c, 0xff } }, - { "darkkhaki", { 0xbd, 0xb7, 0x6b, 0xff } }, - { "gold", { 0xff, 0xd7, 0x00, 0xff } }, - - /* brown */ - { "cornsilk", { 0xff, 0xf8, 0xdc, 0xff } }, - { "blanchedalmond", { 0xff, 0xeb, 0xcd, 0xff } }, - { "bisque", { 0xff, 0xe4, 0xc4, 0xff } }, - { "navajowhite", { 0xff, 0xde, 0xad, 0xff } }, - { "wheat", { 0xf5, 0xde, 0xb3, 0xff } }, - { "burlywood", { 0xde, 0xb8, 0x87, 0xff } }, - { "tan", { 0xd2, 0xb4, 0x8c, 0xff } }, - { "rosybrown", { 0xbc, 0x8f, 0x8f, 0xff } }, - { "sandybrown", { 0xf4, 0xa4, 0x60, 0xff } }, - { "goldenrod", { 0xda, 0xa5, 0x20, 0xff } }, - { "darkgoldenrod", { 0xb8, 0x86, 0x0b, 0xff } }, - { "peru", { 0xcd, 0x85, 0x3f, 0xff } }, - { "chocolate", { 0xd2, 0x69, 0x1e, 0xff } }, - { "saddlebrown", { 0x8b, 0x45, 0x13, 0xff } }, - { "sienna", { 0xa0, 0x52, 0x2d, 0xff } }, - { "brown", { 0xa5, 0x2a, 0x2a, 0xff } }, - { "maroon", { 0x80, 0x00, 0x00, 0xff } }, - - /* green */ - { "darkolivegreen", { 0x55, 0x6b, 0x2f, 0xff } }, - { "olive", { 0x80, 0x80, 0x00, 0xff } }, - { "olivedrab", { 0x6b, 0x8e, 0x23, 0xff } }, - { "yellowgreen", { 0x9a, 0xcd, 0x32, 0xff } }, - { "limegreen", { 0x32, 0xcd, 0x32, 0xff } }, - { "lime", { 0x00, 0xff, 0x00, 0xff } }, - { "lawngreen", { 0x7c, 0xfc, 0x00, 0xff } }, - { "chartreuse", { 0x7f, 0xff, 0x00, 0xff } }, - { "greenyellow", { 0xad, 0xff, 0x2f, 0xff } }, - { "springgreen", { 0x00, 0xff, 0x7f, 0xff } }, - { "mediumspringgreen", { 0x00, 0xfa, 0x9a, 0xff } }, - { "lightgreen", { 0x90, 0xee, 0x90, 0xff } }, - { "palegreen", { 0x98, 0xfb, 0x98, 0xff } }, - { "darkseagreen", { 0x8f, 0xbc, 0x8f, 0xff } }, - { "mediumseagreen", { 0x3c, 0xb3, 0x71, 0xff } }, - { "seagreen", { 0x2e, 0x8b, 0x57, 0xff } }, - { "forestgreen", { 0x22, 0x8b, 0x22, 0xff } }, - { "green", { 0x00, 0x80, 0x00, 0xff } }, - { "darkgreen", { 0x00, 0x64, 0x00, 0xff } }, - - /* cyan */ - { "mediumaquamarine", { 0x66, 0xcd, 0xaa, 0xff } }, - { "aqua", { 0x00, 0xff, 0xff, 0xff } }, - { "cyan", { 0x00, 0xff, 0xff, 0xff } }, - { "lightcyan", { 0xe0, 0xff, 0xff, 0xff } }, - { "paleturquoise", { 0xaf, 0xee, 0xee, 0xff } }, - { "aquamarine", { 0x7f, 0xff, 0xd4, 0xff } }, - { "turquoise", { 0x40, 0xe0, 0xd0, 0xff } }, - { "mediumturquoise", { 0x48, 0xd1, 0xcc, 0xff } }, - { "darkturquoise", { 0x00, 0xce, 0xd1, 0xff } }, - { "lightseagreen", { 0x20, 0xb2, 0xaa, 0xff } }, - { "cadetblue", { 0x5f, 0x9e, 0xa0, 0xff } }, - { "darkcyan", { 0x00, 0x8b, 0x8b, 0xff } }, - { "teal", { 0x00, 0x80, 0x80, 0xff } }, - - /* blue */ - { "lightsteelblue", { 0xb0, 0xc4, 0xde, 0xff } }, - { "powderblue", { 0xb0, 0xe0, 0xe6, 0xff } }, - { "lightblue", { 0xad, 0xd8, 0xe6, 0xff } }, - { "skyblue", { 0x87, 0xce, 0xeb, 0xff } }, - { "lightskyblue", { 0x87, 0xce, 0xfa, 0xff } }, - { "deepskyblue", { 0x00, 0xbf, 0xff, 0xff } }, - { "dodgerblue", { 0x1e, 0x90, 0xff, 0xff } }, - { "cornflowerblue", { 0x64, 0x95, 0xed, 0xff } }, - { "steelblue", { 0x46, 0x82, 0xb4, 0xff } }, - { "royalblue", { 0x41, 0x69, 0xe1, 0xff } }, - { "blue", { 0x00, 0x00, 0xff, 0xff } }, - { "mediumblue", { 0x00, 0x00, 0xcd, 0xff } }, - { "darkblue", { 0x00, 0x00, 0x8b, 0xff } }, - { "navy", { 0x00, 0x00, 0x80, 0xff } }, - { "midnightblue", { 0x19, 0x19, 0x70, 0xff } }, - - /* purple */ - { "lavender", { 0xe6, 0xe6, 0xfa, 0xff } }, - { "thistle", { 0xd8, 0xbf, 0xd8, 0xff } }, - { "plum", { 0xdd, 0xa0, 0xdd, 0xff } }, - { "violet", { 0xee, 0x82, 0xee, 0xff } }, - { "orchid", { 0xda, 0x70, 0xd6, 0xff } }, - { "fuchsia", { 0xff, 0x00, 0xff, 0xff } }, - { "magenta", { 0xff, 0x00, 0xff, 0xff } }, - { "mediumorchid", { 0xba, 0x55, 0xd3, 0xff } }, - { "mediumpurple", { 0x93, 0x70, 0xdb, 0xff } }, - { "blueviolet", { 0x8a, 0x2b, 0xe2, 0xff } }, - { "darkviolet", { 0x94, 0x00, 0xd3, 0xff } }, - { "darkorchid", { 0x99, 0x32, 0xcc, 0xff } }, - { "darkmagenta", { 0x8b, 0x00, 0x8b, 0xff } }, - { "purple", { 0x80, 0x00, 0x80, 0xff } }, - { "indigo", { 0x4b, 0x00, 0x82, 0xff } }, - { "darkslateblue", { 0x48, 0x3d, 0x8b, 0xff } }, - { "rebeccapurple", { 0x66, 0x33, 0x99, 0xff } }, - { "slateblue", { 0x6a, 0x5a, 0xcd, 0xff } }, - { "mediumslateblue", { 0x7b, 0x68, 0xee, 0xff } }, - - /* white */ - { "white", { 0xff, 0xff, 0xff, 0xff } }, - { "snow", { 0xff, 0xfa, 0xfa, 0xff } }, - { "honeydew", { 0xf0, 0xff, 0xf0, 0xff } }, - { "mintcream", { 0xf5, 0xff, 0xfa, 0xff } }, - { "azure", { 0xf0, 0xff, 0xff, 0xff } }, - { "aliceblue", { 0xf0, 0xf8, 0xff, 0xff } }, - { "ghostwhite", { 0xf8, 0xf8, 0xff, 0xff } }, - { "whitesmoke", { 0xf5, 0xf5, 0xf5, 0xff } }, - { "seashell", { 0xff, 0xf5, 0xee, 0xff } }, - { "beige", { 0xf5, 0xf5, 0xdc, 0xff } }, - { "oldlace", { 0xfd, 0xf5, 0xe6, 0xff } }, - { "floralwhite", { 0xff, 0xfa, 0xf0, 0xff } }, - { "ivory", { 0xff, 0xff, 0xf0, 0xff } }, - { "antiquewhite", { 0xfa, 0xeb, 0xd7, 0xff } }, - { "linen", { 0xfa, 0xf0, 0xe6, 0xff } }, - { "lavenderblush", { 0xff, 0xf0, 0xf5, 0xff } }, - { "mistyrose", { 0xff, 0xe4, 0xe1, 0xff } }, - - /* grey/black */ - { "gainsboro", { 0xdc, 0xdc, 0xdc, 0xff } }, - { "lightgrey", { 0xd3, 0xd3, 0xd3, 0xff } }, - { "silver", { 0xc0, 0xc0, 0xc0, 0xff } }, - { "darkgray", { 0xa9, 0xa9, 0xa9, 0xff } }, - { "gray", { 0x80, 0x80, 0x80, 0xff } }, - { "dimgray", { 0x69, 0x69, 0x69, 0xff } }, - { "lightslategray", { 0x77, 0x88, 0x99, 0xff } }, - { "slategray", { 0x70, 0x80, 0x90, 0xff } }, - { "darkslategray", { 0x2f, 0x4f, 0x4f, 0xff } }, - { "black", { 0x00, 0x00, 0x00, 0xff } }, -}; - - -//----------------------------------------------------------------------------- -template -static colour -lookup_colour (const std::string &name, - const std::map> &map) -{ - std::string lower (name); - std::transform (lower.begin (), lower.end (), lower.begin (), tolower); - - auto pos = map.find (lower); - if (pos == map.end ()) - throw std::out_of_range (name); - - static_assert (S <= 4, "cannot invent additional data"); - return pos->second.template redim ().template cast (); -} - - -//----------------------------------------------------------------------------- -template -colour -colour::from_html (const std::string &name) -{ - return lookup_colour (name, HTML_COLOURS); -} - - -//----------------------------------------------------------------------------- -template -colour -colour::from_x11 (const std::string &name) -{ - return lookup_colour (name, X11_COLOURS); -} - - -/////////////////////////////////////////////////////////////////////////////// -colour3f -util::rgb_to_hsv (colour3f rgb) -{ - // Calculate chroma - auto M = max (rgb); - auto m = min (rgb); - auto C = M - m; - - // Undefined for zero chroma - if (almost_zero (C)) - return { -1.f, 0.f, M }; - - // Calculate hue - float H = exactly_equal (rgb.r, M) ? (rgb.g - rgb.b) : - exactly_equal (rgb.g, M) ? 2 + (rgb.b - rgb.r) : - exactly_equal (rgb.b, M) ? 4 + (rgb.r - rgb.g) : - 0 ; - - H /= C; - H *= 60; - - if (H < 0) - H += 360; - - // Calculate value - auto V = M; - - // Calculate saturation - auto S = almost_zero (V) ? 0.f : C / V; - - return { H, S, V }; -} - - -//----------------------------------------------------------------------------- -colour3f -util::hsv_to_rgb (colour3f hsv) -{ - CHECK_GE (hsv.h, 0); - CHECK_LT (hsv.h, 360); - CHECK_GE (hsv.s, 0); - CHECK_LE (hsv.s, 1); - CHECK_GE (hsv.v, 0); - CHECK_LE (hsv.v, 1); - - float C = hsv.v * hsv.s; - float H = hsv.h / 60; - float X = C * (1 - std::abs (std::fmod (H, 2.f) - 1)); - - // monochromatic'ish - if (almost_zero (hsv.s)) - return colour3f { hsv.v }; - - colour3f rgb; - - unsigned hex = (unsigned)H; - switch (hex) { - case 0: rgb = { C, X, 0 }; break; - case 1: rgb = { X, C, 0 }; break; - case 2: rgb = { 0, C, X }; break; - case 3: rgb = { 0, X, C }; break; - case 4: rgb = { X, 0, C }; break; - case 5: rgb = { C, 0, X }; break; - } - - auto m = hsv.v - C; - - return rgb + m; -} - - -///---------------------------------------------------------------------------- -/// Extract a colour object from a JSON node. -#include "json/tree.hpp" - -namespace json::tree { - template <> - util::colour4f - io::deserialise (const node &root) { - return { - root[0].as (), - root[1].as (), - root[2].as (), - root[3].as (), - }; - } -} - - -/////////////////////////////////////////////////////////////////////////////// -template -std::ostream& -util::operator<< (std::ostream &os, util::colour c) { - os << "colour("; - for (size_t i = 0; i < S - 1; ++i) - os << +c[i] << ", "; - os << +c[S-1] << ")"; - return os; -} - - -//----------------------------------------------------------------------------- -template -std::istream& -util::operator>> (std::istream &is, util::colour &c) -{ - std::array< - std::conditional_t< - sizeof(T) == 1, - uint16_t, - T - >,S - > v; - - static_assert (S > 0, "current implementation requires strictly positive components"); - char comma; - - for (size_t i = 0; i < S - 1; ++i) { - is >> v[i] >> comma; - - if (comma != ',' || is.eof ()) { - is.setstate (std::ios_base::failbit); - return is; - } - } - - is >> v[S-1]; - - if (!std::is_same::value) { - if (std::any_of (std::cbegin (v), - std::cend (v), - [] (auto i) { - return i > std::numeric_limits::max (); - })) { - is.setstate (std::ios_base::failbit); - return is; - } - } - - std::copy (std::cbegin (v), - std::cend (v), - std::begin (c)); - - return is; -} - -template std::istream& util::operator>> (std::istream&, util::colour<3,uint8_t>&); - -/////////////////////////////////////////////////////////////////////////////// -#define INSTANTIATE_S_T(S,T) \ -template \ -struct util::colour; \ - \ -template \ -std::ostream& \ -util::operator<< (std::ostream&, util::colour); \ - \ -template \ -const char* \ -util::to_string> (void); - - -//----------------------------------------------------------------------------- -#define INSTANTIATE_S(S) \ -INSTANTIATE_S_T(S,uint8_t) \ -INSTANTIATE_S_T(S,float) \ -INSTANTIATE_S_T(S,double) - - -//----------------------------------------------------------------------------- -INSTANTIATE_S(1) -INSTANTIATE_S(3) -INSTANTIATE_S(4) diff --git a/colour.hpp b/colour.hpp index 7bed5b15..7e49056d 100644 --- a/colour.hpp +++ b/colour.hpp @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * Copyright 2010-2015 Danny Robson + * Copyright 2010-2017 Danny Robson */ #ifndef __UTIL_COLOUR_HPP @@ -21,68 +21,94 @@ #include "introspection.hpp" #include +#include namespace util { - /// An RGBA colour POD type. - template - struct colour : public coord::base { - using coord::base::base; - using base_t = coord::base; + /// An abstract colour POD type componsed of S components of type T. + /// + /// Not to be used directly, instead the use of derived types is required. + /// This exists purely to simplify generic colour code. + template < + size_t S, + typename T, + typename SelfT + > + struct colour : coord::base { + using coord::base::base; - // overloaded cast operator which assumes values are unit normalised template - colour - cast (void) const; - - /// parse colours specified as "#AABBCCDD". - /// - /// * the leading hash is optional. - /// * all components must be 2 hex digits. - static colour parse_html (const char*); - static colour parse_html (const std::string&); - - /// look up the name of a colour from those specified in - /// html/x11/etc specifications. - static colour from_html (const std::string &name); - static colour from_x11 (const std::string &name); - - /// look up all the specifications and returns the colour from one - /// that matches. the search order is unspecified, so if you want a - /// known colour then try them first yourself. - static colour from_string (const std::string &name); + auto + cast (void) const + { + ::util::revalue_t ret; + std::transform (std::begin (*this), + std::end (*this), + std::begin (ret), + renormalise); + return ret; + } }; - // Convenience types - template using colour1 = colour<1,T>; - template using colour3 = colour<3,T>; - template using colour4 = colour<4,T>; - - typedef colour1 colour1u; - typedef colour3 colour3u; - typedef colour4 colour4u; - - typedef colour1 colour1f; - typedef colour3 colour3f; - typedef colour4 colour4f; - - // RGB/HSV conversions - colour3f rgb_to_hsv (colour3f); - colour3f hsv_to_rgb (colour3f); - - // ostream/istream operators - template - std::ostream& - operator<< (std::ostream&, util::colour); - - template - std::istream& - operator>> (std::istream&, util::colour&); - - // type name introspection specialisation - template - struct type_name> { - static constexpr const char value[] = "colour"; + template + struct util::coord::store<1,T,srgba<1,T>> { + union { struct { T r; }; T data[1]; }; }; + template + struct util::coord::store<2,T,srgba<2,T>> { + union { struct { T r, g; }; T data[2]; }; + }; + template + struct util::coord::store<3,T,srgba<3,T>> { + union { struct { T r, g, b; }; T data[3]; }; + }; + + template + struct util::coord::store<4,T,srgba<4,T>> { + union { struct { T r, g, b, a; }; T data[4]; }; + }; + + template struct srgba : colour> { + using colour>::colour; + }; + + using srgba3f = srgba<3,float>; + using srgba4f = srgba<4,float>; + + template struct hsva : colour> {}; + + template + struct redim_type< + srgba + > { template using type = srgba<_S,T>; }; + + template + struct revalue_type> { + template + using type = srgba; + }; + + + template struct is_colour : public std::false_type {}; + template < + size_t S, + typename T, + template < + size_t, + typename + > typename ColourT + > struct is_colour> + :std::conditional_t< + std::is_base_of_v< + colour>, + ColourT + >, + std::true_type, + std::false_type + > {}; + + + template + constexpr auto is_colour_v = is_colour::value; } #include "colour.ipp" diff --git a/colour.ipp b/colour.ipp index 37b8f2eb..0f334864 100644 --- a/colour.ipp +++ b/colour.ipp @@ -19,15 +19,3 @@ #endif #define __UTIL_COLOUR_IPP -template -template -util::colour -util::colour::cast (void) const -{ - colour ret; - std::transform (this->begin (), - this->end (), - ret.begin (), - renormalise); - return ret; -} diff --git a/coord/base.hpp b/coord/base.hpp index bc3c0d65..81065d44 100644 --- a/coord/base.hpp +++ b/coord/base.hpp @@ -17,44 +17,56 @@ #ifndef __UTIL_COORD_BASE_HPP #define __UTIL_COORD_BASE_HPP +#include "fwd.hpp" + #include "init.hpp" +#include "traits.hpp" #include "../maths.hpp" #include #include #include + namespace util::coord { ///////////////////////////////////////////////////////////////////////// + // the base class for all coordinate-like types. + // + // SelfT should not be exposed as a template template directly because + // some types (eg, XYZ colours) do not conform to the same template + // parameters are others (eg, vector2f). ie, it does not make sense to + // allow redim, or type changing on some types so they just aren't exposed. template < size_t S, typename T, - template class KLASS, - typename ...tags + typename SelfT > - struct base : public init { + struct base : public init { static_assert (S > 0); static_assert (std::is_arithmetic::value); + static_assert (sizeof (init) == S * sizeof (T)); using value_type = T; static constexpr size_t dimension = S; static constexpr size_t elements = S; - static constexpr size_t size (void) { return S; } + static constexpr auto size (void) { return S; } // constructors - using init::init; + using init::init; base () = default; constexpr explicit base (T val) { std::fill (begin (), end (), val); } - constexpr base (const base &rhs) = default; - base& operator= (const base &rhs) = default; + constexpr base (const base &rhs) = default; + base& operator= (const base &rhs) = default; // element accessors T& operator[] (size_t i) { return this->data[i]; } constexpr const T& operator[] (size_t i) const { return this->data[i]; } + T& operator[] (int i) { return this->data[i]; } + constexpr const T& operator[] (int i) const { return this->data[i]; } auto cbegin (void) const { return std::cbegin (this->data); } auto cend (void) const { return std::cend (this->data); } @@ -81,12 +93,28 @@ namespace util::coord { return k; } + + //--------------------------------------------------------------------- + template < + typename K, + typename = std::enable_if_t,void> + > + K as (void) const + { + static_assert (K::elements == elements); + K k; + std::copy (begin (), end (), k.begin ()); + return k; + } + + //--------------------------------- template - KLASS + auto cast (void) const { - KLASS out; + typename revalue_type::template type out; + std::copy (std::cbegin (this->data), std::cend (this->data), std::begin (out.data)); @@ -95,11 +123,18 @@ namespace util::coord { /////////////////////////////////////////////////////////////////////// // redimension - template - KLASS + template < + size_t D, + typename _sfinae = SelfT + > + std::enable_if_t< + has_redim_v<_sfinae>, + redim_t<_sfinae,D> + > redim (void) const { - KLASS out; + redim_t out; + std::copy_n (std::cbegin (this->data), min (S, D), std::begin (out.data)); @@ -108,11 +143,14 @@ namespace util::coord { //--------------------------------------------------------------------- - template - KLASS - redim (const KLASS fill) const + template + std::enable_if_t< + has_redim_v<_sfinae>, + redim_t<_sfinae,D> + > + redim (const redim_t<_sfinae,D> fill) const { - KLASS out; + redim_t out; static constexpr auto L1 = min (S, D); static constexpr auto L2 = D - L1; @@ -128,11 +166,17 @@ namespace util::coord { } //--------------------------------------------------------------------- - template - KLASS + template < + size_t D, + typename _sfinae = SelfT + > + std::enable_if_t< + has_redim_v<_sfinae>, + redim_t<_sfinae,D> + > redim (T fill) const { - KLASS out; + redim_t out; auto cursor = std::copy_n (std::cbegin (this->data), min (S, D), @@ -144,5 +188,6 @@ namespace util::coord { }; } +#include "ops.hpp" #endif diff --git a/coord/fwd.hpp b/coord/fwd.hpp index e1c3347e..fcd41a8a 100644 --- a/coord/fwd.hpp +++ b/coord/fwd.hpp @@ -14,11 +14,20 @@ * Copyright 2016 Danny Robson */ -#ifndef __UTIL_COORD_FWD_HPP -#define __UTIL_COORD_FWD_HPP +#ifndef CRUFT_UTIL_COORD_FWD_HPP +#define CRUFT_UTIL_COORD_FWD_HPP + +#include namespace util { - template struct colour; + namespace coord { + template struct store; + template struct init; + template struct base; + } + + template struct srgba; + template struct hsva; template struct extent; template struct point; template struct vector; diff --git a/coord/init.hpp b/coord/init.hpp index 5423e75b..478bcd0b 100644 --- a/coord/init.hpp +++ b/coord/init.hpp @@ -22,53 +22,53 @@ #include namespace util::coord { - template + template struct init; //------------------------------------------------------------------------- - template - struct init<1,T,tags...> : public store<1,T,tags...> + template + struct init<1,T,SelfT> : public store<1,T,SelfT> { - using store<1,T,tags...>::store; + using store<1,T,SelfT>::store; constexpr init () = default; constexpr init (T v0): - store<1,T,tags...> ({v0}) + store<1,T,SelfT> ({v0}) { ; } }; //------------------------------------------------------------------------- - template - struct init<2,T,tags...> : public store<2,T,tags...> + template + struct init<2,T,SelfT> : public store<2,T,SelfT> { - using store<2,T,tags...>::store; + using store<2,T,SelfT>::store; constexpr init () = default; constexpr init (T v0, T v1): - store<2,T,tags...> ({ v0, v1 }) + store<2,T,SelfT> ({ v0, v1 }) { ; } }; //------------------------------------------------------------------------- - template - struct init<3,T,tags...> : public store<3,T,tags...> + template + struct init<3,T,SelfT> : public store<3,T,SelfT> { - using store<3,T,tags...>::store; + using store<3,T,SelfT>::store; constexpr init () = default; constexpr init (T v0, T v1, T v2): - store<3,T,tags...> ({v0, v1, v2}) + store<3,T,SelfT> ({v0, v1, v2}) { ; } }; //------------------------------------------------------------------------- - template - struct init<4,T,tags...> : public store<4,T,tags...> + template + struct init<4,T,SelfT> : public store<4,T,SelfT> { - using store<4,T,tags...>::store; + using store<4,T,SelfT>::store; constexpr init () = default; constexpr init (T v0, T v1, T v2, T v3): - store<4,T,tags...> ({ v0, v1, v2, v3 }) + store<4,T,SelfT> ({ v0, v1, v2, v3 }) { ; } }; } diff --git a/coord/iostream.hpp b/coord/iostream.hpp index c95b0d7f..2d1a4eac 100644 --- a/coord/iostream.hpp +++ b/coord/iostream.hpp @@ -24,8 +24,8 @@ namespace util { template < - template class K, - size_t S, + template class K, + std::size_t S, typename T > std::ostream& diff --git a/coord/names.hpp b/coord/names.hpp deleted file mode 100644 index d34dec13..00000000 --- a/coord/names.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Copyright 2015 Danny Robson - */ - -#ifndef __UTIL_COORD_NAMES_HPP -#define __UTIL_COORD_NAMES_HPP - -namespace util::coord { - /////////////////////////////////////////////////////////////////////// - // tags for accessor names - // - // colours - struct rgba { }; - struct hsv { }; - - // physical positions - struct xyzw { }; - - // texture coords - struct stpq { }; - - // physical dimensions - struct whd { }; - - // quaternions - struct wxyz { }; - struct abcd { }; -} - -#endif diff --git a/coord/ops.hpp b/coord/ops.hpp index 9d6a36ab..f5b52ef7 100644 --- a/coord/ops.hpp +++ b/coord/ops.hpp @@ -18,6 +18,7 @@ #define __UTIL_COORDS_OPS #include "fwd.hpp" +#include "traits.hpp" #include "../debug.hpp" #include "../maths.hpp" @@ -28,245 +29,273 @@ #include #include #include +#include namespace util { - /////////////////////////////////////////////////////////////////////// - // operation traits - namespace coord { - template < - template class A, - template class B - > - struct result { }; - - //------------------------------------------------------------------------- - template <> struct result { template using type = colour; }; - template <> struct result { template using type = extent; }; - template <> struct result { template using type = extent; }; - template <> struct result { template using type = point ; }; - template <> struct result { template using type = point ; }; - template <> struct result { template using type = point ; }; - template <> struct result { template using type = vector; }; - - template < - template class A, - template class B - > - using result_t = typename result::type; - - - //--------------------------------------------------------------------- - template