rename root namespace from util to cruft

This places, at long last, the core library code into the same namespace
as the extended library code.
This commit is contained in:
Danny Robson 2018-08-05 14:42:02 +10:00
parent 803acc9a87
commit f6056153e3
363 changed files with 2169 additions and 2182 deletions

View File

@ -420,8 +420,9 @@ DEPENDS
############################################################################### ###############################################################################
add_library(cruft-util ${UTIL_FILES}) add_library(cruft ${UTIL_FILES})
target_include_directories(cruft-util PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") add_library(cruft-util ALIAS cruft)
target_include_directories(cruft PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
search_libs (SHM_LIBS shm_open rt) search_libs (SHM_LIBS shm_open rt)
@ -429,21 +430,21 @@ search_libs (DL_LIBS dlopen dl)
search_libs (CLOCK_LIBS clock_gettime rt c) search_libs (CLOCK_LIBS clock_gettime rt c)
search_libs (MATH_LIBS cos m) search_libs (MATH_LIBS cos m)
target_link_libraries(cruft-util ${SHM_LIBS}) target_link_libraries(cruft ${SHM_LIBS})
target_link_libraries(cruft-util ${DL_LIBS}) target_link_libraries(cruft ${DL_LIBS})
target_link_libraries(cruft-util ${CLOCK_LIBS}) target_link_libraries(cruft ${CLOCK_LIBS})
target_link_libraries(cruft-util ${MATH_LIBS}) target_link_libraries(cruft ${MATH_LIBS})
# HACK: -ldl isn't getting discovered correctly so we add it unconditionally # HACK: -ldl isn't getting discovered correctly so we add it unconditionally
# for the time being. # for the time being.
target_link_libraries(cruft-util dl) target_link_libraries(cruft dl)
############################################################################### ###############################################################################
foreach (tool cpuid poisson macro scratch) foreach (tool cpuid poisson macro scratch)
add_executable (util_${tool} tools/${tool}.cpp) add_executable (util_${tool} tools/${tool}.cpp)
set_target_properties (util_${tool} PROPERTIES OUTPUT_NAME ${tool}) set_target_properties (util_${tool} PROPERTIES OUTPUT_NAME ${tool})
target_link_libraries (util_${tool} cruft-util) target_link_libraries (util_${tool} cruft)
target_include_directories(util_${tool} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(util_${tool} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
endforeach () endforeach ()
@ -547,7 +548,7 @@ if (TESTS)
foreach(t ${TEST_BIN}) foreach(t ${TEST_BIN})
string(REPLACE "/" "_" name "test/${t}") string(REPLACE "/" "_" name "test/${t}")
add_executable(util_${name} test/${t}.cpp) add_executable(util_${name} test/${t}.cpp)
target_link_libraries(util_${name} PRIVATE cruft-util) target_link_libraries(util_${name} PRIVATE cruft)
target_include_directories(util_${name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(util_${name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
add_test(NAME util_${name} COMMAND util_${name}) add_test(NAME util_${name} COMMAND util_${name})
set_tests_properties(util_${name} PROPERTIES FAIL_REGULAR_EXPRESSION "not ok -") set_tests_properties(util_${name} PROPERTIES FAIL_REGULAR_EXPRESSION "not ok -")
@ -561,12 +562,5 @@ endif ()
############################################################################### ###############################################################################
get_directory_property (HAS_PARENT PARENT_DIRECTORY) configure_file(libcruft.pc.in libcruft.pc)
if (HAS_PARENT)
set (CRUFT_UTIL_FOUND 1 PARENT_SCOPE)
endif ()
##-----------------------------------------------------------------------------
configure_file(libcruft-util-system.pc.in libcruft-util.pc)
configure_file(Doxyfile.in Doxyfile) configure_file(Doxyfile.in Doxyfile)

View File

@ -1,4 +1,4 @@
== libcruft-util == libcruft
A simple cross-platform C++ utility library. A simple cross-platform C++ utility library.

View File

@ -14,14 +14,14 @@
//#include <iostream> //#include <iostream>
// //
// //
//using util::adapter::scalar; //using cruft::adapter::scalar;
// //
// //
//void //void
//foo (void) { //foo (void) {
// std::vector<std::tuple<int,int,int>> vals; // std::vector<std::tuple<int,int,int>> vals;
// //
// using iterator_t = util::adapter::scalar<0, decltype(vals.begin ())>; // using iterator_t = cruft::adapter::scalar<0, decltype(vals.begin ())>;
// //
// static_assert ( // static_assert (
// std::is_same< // std::is_same<

View File

@ -13,7 +13,7 @@
#include <cstddef> #include <cstddef>
#include <iterator> #include <iterator>
namespace util::adapter { namespace cruft::adapter {
namespace container { namespace container {
// reverse a container for range-based-for // reverse a container for range-based-for
template <typename T> template <typename T>

View File

@ -15,4 +15,4 @@
// //
// this particular instantiation isn't necessarily required by any user, it's // this particular instantiation isn't necessarily required by any user, it's
// just convenient. // just convenient.
template void cruft::util::sort::soa (int*, int*, bool (*)(int,int), double*); template void cruft::cruft::sort::soa (int*, int*, bool (*)(int,int), double*);

View File

@ -19,7 +19,7 @@
#include <vector> #include <vector>
namespace cruft::util::sort { namespace cruft::cruft::sort {
namespace detail { namespace detail {
template <typename IndexA, typename IndexB, typename RandomIt> template <typename IndexA, typename IndexB, typename RandomIt>
void void
@ -140,7 +140,7 @@ namespace cruft::util::sort {
// reorder function. // reorder function.
// TODO: avoid the need for this inverse array. // TODO: avoid the need for this inverse array.
decltype (indices) dest (indices.size ()); decltype (indices) dest (indices.size ());
for (decltype(size) i = 0; i < ::util::cast::sign<ssize_t> (dest.size ()); ++i) { for (decltype(size) i = 0; i < ::cruft::cast::sign<ssize_t> (dest.size ()); ++i) {
dest[indices[i]] = i; dest[indices[i]] = i;
} }

View File

@ -15,7 +15,7 @@
// C++11 allocator concept conformant(ish) allocator adaptor, going from our // C++11 allocator concept conformant(ish) allocator adaptor, going from our
// allocator interface to that of the STL and friends. // allocator interface to that of the STL and friends.
namespace util::alloc { namespace cruft::alloc {
template <typename ValueT, typename BackingT> template <typename ValueT, typename BackingT>
class allocator { class allocator {
public: public:
@ -28,7 +28,7 @@ namespace util::alloc {
{ ; } { ; }
util::view<ValueT*> cruft::view<ValueT*>
allocate (size_t count) allocate (size_t count)
{ {
return { return {

View File

@ -16,7 +16,7 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
namespace util::alloc { namespace cruft::alloc {
/// wraps a block allocator with an interface suitable for allocating /// wraps a block allocator with an interface suitable for allocating
/// individual objects. /// individual objects.
template <class T> template <class T>
@ -49,13 +49,13 @@ namespace util::alloc {
release (U *u) release (U *u)
{ {
u->~U (); u->~U ();
m_store.template deallocate<U> (util::view {u,1u}); m_store.template deallocate<U> (cruft::view {u,1u});
} }
//--------------------------------------------------------------------- //---------------------------------------------------------------------
template <typename U> template <typename U>
using deleter_t = util::memory::owner_deleter< using deleter_t = cruft::memory::owner_deleter<
U,arena<T>,&arena::release U,arena<T>,&arena::release
>; >;

View File

@ -11,7 +11,7 @@
#include <utility> #include <utility>
namespace util::alloc { namespace cruft::alloc {
template <typename BackingT> template <typename BackingT>
class forwarding { class forwarding {
public: public:

View File

@ -10,7 +10,7 @@
#define __UTIL_ALLOC_FWD_HPP #define __UTIL_ALLOC_FWD_HPP
namespace util::alloc { namespace cruft::alloc {
namespace raw { namespace raw {
class affix; class affix;
class fallback; class fallback;

View File

@ -8,7 +8,7 @@
#include "affix.hpp" #include "affix.hpp"
using util::alloc::raw::affix; using cruft::alloc::raw::affix;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -13,7 +13,7 @@
#include <cstddef> #include <cstddef>
namespace util::alloc::raw { namespace cruft::alloc::raw {
/// a raw memory allocator which initialises an instance of PrefixT /// a raw memory allocator which initialises an instance of PrefixT
/// immediately before each allocation and, if specified, an instance /// immediately before each allocation and, if specified, an instance
/// of SuffixT after the allocation. /// of SuffixT after the allocation.
@ -25,13 +25,13 @@ namespace util::alloc::raw {
class affix { class affix {
template <typename T> template <typename T>
util::view<T*> allocate (size_t bytes); cruft::view<T*> allocate (size_t bytes);
template <typename T> template <typename T>
util::view<T*> allocate (size_t bytes, size_t align); cruft::view<T*> allocate (size_t bytes, size_t align);
template <typename T> template <typename T>
void deallocate (util::view<std::byte*>); void deallocate (cruft::view<std::byte*>);
std::byte* begin (void); std::byte* begin (void);
const std::byte* begin (void) const; const std::byte* begin (void) const;

View File

@ -15,14 +15,14 @@
#include <cstddef> #include <cstddef>
#include <utility> #include <utility>
namespace util::alloc::raw::aligned { namespace cruft::alloc::raw::aligned {
/// wraps a child allocator and enforces a fixed alignment /// wraps a child allocator and enforces a fixed alignment
template <typename ChildT> template <typename ChildT>
class direct { class direct {
public: public:
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
template <typename ...Args> template <typename ...Args>
direct (util::view<std::byte*> _data, std::size_t _alignment, Args &&...args): direct (cruft::view<std::byte*> _data, std::size_t _alignment, Args &&...args):
m_successor (_data, std::forward<Args> (args)...), m_successor (_data, std::forward<Args> (args)...),
m_alignment (_alignment) m_alignment (_alignment)
{ ; } { ; }
@ -39,7 +39,7 @@ namespace util::alloc::raw::aligned {
//--------------------------------------------------------------------- //---------------------------------------------------------------------
template <typename T> template <typename T>
auto auto
deallocate (util::view<T*> ptr) deallocate (cruft::view<T*> ptr)
{ {
return m_successor.template deallocate<T> (ptr); return m_successor.template deallocate<T> (ptr);
} }

View File

@ -18,7 +18,7 @@
#include <cstddef> #include <cstddef>
#include <utility> #include <utility>
namespace util::alloc::raw::aligned { namespace cruft::alloc::raw::aligned {
/// wraps a child allocator and enforces a fixed alignment that is /// wraps a child allocator and enforces a fixed alignment that is
/// independant of the alignment of the provided source buffer. /// independant of the alignment of the provided source buffer.
/// ///
@ -45,7 +45,7 @@ namespace util::alloc::raw::aligned {
class foreign { class foreign {
public: public:
template <typename ...Args> template <typename ...Args>
foreign (util::view<std::byte*> _data, std::size_t _alignment, Args &&...args): foreign (cruft::view<std::byte*> _data, std::size_t _alignment, Args &&...args):
m_successor ( m_successor (
view<std::byte*> { view<std::byte*> {
reinterpret_cast<std::byte*> (_alignment), reinterpret_cast<std::byte*> (_alignment),
@ -60,7 +60,7 @@ namespace util::alloc::raw::aligned {
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (std::size_t count) allocate (std::size_t count)
{ {
auto root = m_successor.template allocate<T> (count); auto root = m_successor.template allocate<T> (count);
@ -68,12 +68,12 @@ namespace util::alloc::raw::aligned {
// we can't use alignment cast here because it will almost // we can't use alignment cast here because it will almost
// certainly fail the tests it performs. // certainly fail the tests it performs.
return { util::cast::ffs<T*> (base + m_offset), count }; return { cruft::cast::ffs<T*> (base + m_offset), count };
} }
template <typename T> template <typename T>
auto auto
deallocate (util::view<T*> ptr) deallocate (cruft::view<T*> ptr)
{ {
auto base = ptr.template cast<char*> (); auto base = ptr.template cast<char*> ();
auto next = base - m_offset; auto next = base - m_offset;
@ -81,7 +81,7 @@ namespace util::alloc::raw::aligned {
// we can't use alignment cast here because it will almost // we can't use alignment cast here because it will almost
// certainly fail the tests it performs. // certainly fail the tests it performs.
return m_successor.template deallocate<T> ( return m_successor.template deallocate<T> (
util::view<T*> { util::cast::ffs<T*> (next), ptr.size () } cruft::view<T*> { cruft::cast::ffs<T*> (next), ptr.size () }
); );
} }

View File

@ -14,7 +14,7 @@
#include <cstddef> #include <cstddef>
#include <memory> #include <memory>
namespace util::alloc::raw { namespace cruft::alloc::raw {
// wraps an allocator given at construction time, forwarding all calls to // wraps an allocator given at construction time, forwarding all calls to
// the inner object. used to allow virtual dispatch of the non-virtual // the inner object. used to allow virtual dispatch of the non-virtual
// allocator interface. // allocator interface.
@ -93,8 +93,8 @@ namespace util::alloc::raw {
virtual ~interface () { ; } virtual ~interface () { ; }
// allocation management // allocation management
virtual util::view<std::byte*> allocate (size_t bytes) = 0; virtual cruft::view<std::byte*> allocate (size_t bytes) = 0;
virtual util::view<std::byte*> allocate (size_t bytes, size_t alignment) = 0; virtual cruft::view<std::byte*> allocate (size_t bytes, size_t alignment) = 0;
virtual void deallocate (void *ptr, size_t bytes) = 0; virtual void deallocate (void *ptr, size_t bytes) = 0;
virtual void deallocate (void *ptr, size_t bytes, size_t alignment) = 0; virtual void deallocate (void *ptr, size_t bytes, size_t alignment) = 0;
@ -127,7 +127,7 @@ namespace util::alloc::raw {
{ ; } { ; }
// allocation management // allocation management
util::view<std::byte*> cruft::view<std::byte*>
allocate (size_t bytes) override allocate (size_t bytes) override
{ return m_target.allocate (bytes); } { return m_target.allocate (bytes); }
@ -135,7 +135,7 @@ namespace util::alloc::raw {
// we can't totally eliminate this call given the point is to // we can't totally eliminate this call given the point is to
// expose the common API area, but we will throw if the operation // expose the common API area, but we will throw if the operation
// is unsupported in the child. // is unsupported in the child.
util::view<std::byte*> cruft::view<std::byte*>
allocate (size_t bytes, size_t alignment) override allocate (size_t bytes, size_t alignment) override
{ {
if constexpr (has_aligned_allocate_v<ChildT>) { if constexpr (has_aligned_allocate_v<ChildT>) {

View File

@ -14,7 +14,7 @@
#include <cstddef> #include <cstddef>
#include <tuple> #include <tuple>
namespace util::alloc::raw { namespace cruft::alloc::raw {
/// A raw memory allocator that allocates memory series of child /// A raw memory allocator that allocates memory series of child
/// allocators, preferring earlier allocators. /// allocators, preferring earlier allocators.
template <typename ...ChildT> template <typename ...ChildT>
@ -25,15 +25,15 @@ namespace util::alloc::raw {
{ ; } { ; }
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t bytes); allocate (size_t bytes);
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t bytes, size_t align); allocate (size_t bytes, size_t align);
template <typename T> template <typename T>
void deallocate (util::view<std::byte*> ptr); void deallocate (cruft::view<std::byte*> ptr);
private: private:
std::tuple<ChildT&...> m_children; std::tuple<ChildT&...> m_children;

View File

@ -11,11 +11,11 @@
#include "../../pointer.hpp" #include "../../pointer.hpp"
#include "../../debug.hpp" #include "../../debug.hpp"
using util::alloc::raw::linear; using cruft::alloc::raw::linear;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
linear::linear (util::view<std::byte*> _data): linear::linear (cruft::view<std::byte*> _data):
m_begin (_data.begin ()), m_begin (_data.begin ()),
m_end (_data.end ()), m_end (_data.end ()),
m_cursor (_data.begin ()) m_cursor (_data.begin ())

View File

@ -15,7 +15,7 @@
#include <cstddef> #include <cstddef>
#include <iterator> #include <iterator>
namespace util::alloc::raw { namespace cruft::alloc::raw {
// allocate progressively across a buffer without concern for deallocation. // allocate progressively across a buffer without concern for deallocation.
// deallocation is a noop; the only way to free allocations is via reset. // deallocation is a noop; the only way to free allocations is via reset.
class linear { class linear {
@ -25,10 +25,10 @@ namespace util::alloc::raw {
linear& operator= (const linear&) = delete; linear& operator= (const linear&) = delete;
linear& operator= (linear&&) = delete; linear& operator= (linear&&) = delete;
linear (util::view<std::byte*> _data); linear (cruft::view<std::byte*> _data);
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count) allocate (size_t count)
{ {
auto const bytes = count * sizeof (T); auto const bytes = count * sizeof (T);
@ -37,27 +37,27 @@ namespace util::alloc::raw {
auto ptr = m_cursor; auto ptr = m_cursor;
m_cursor += bytes; m_cursor += bytes;
return { util::cast::alignment<T*> (ptr), count }; return { cruft::cast::alignment<T*> (ptr), count };
} }
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count, size_t alignment) allocate (size_t count, size_t alignment)
{ {
auto const bytes = count * sizeof (T); auto const bytes = count * sizeof (T);
auto ptr = util::align (m_cursor, alignment); auto ptr = cruft::align (m_cursor, alignment);
if (ptr + bytes > m_end) if (ptr + bytes > m_end)
throw std::bad_alloc (); throw std::bad_alloc ();
m_cursor = ptr + bytes; m_cursor = ptr + bytes;
return { util::cast::alignment<T*> (ptr), count }; return { cruft::cast::alignment<T*> (ptr), count };
} }
template <typename T> template <typename T>
void deallocate (util::view<T*> ptr) void deallocate (cruft::view<T*> ptr)
{ {
(void)ptr; (void)ptr;
} }
@ -81,12 +81,12 @@ namespace util::alloc::raw {
CHECK_MOD (reinterpret_cast<uintptr_t> (ptr), sizeof (ValueT)); CHECK_MOD (reinterpret_cast<uintptr_t> (ptr), sizeof (ValueT));
CHECK_MOD (reinterpret_cast<uintptr_t> (data ()), sizeof (ValueT)); CHECK_MOD (reinterpret_cast<uintptr_t> (data ()), sizeof (ValueT));
return ptr - util::cast::alignment<ValueT const*> (data ()); return ptr - cruft::cast::alignment<ValueT const*> (data ());
} }
template <typename T> template <typename T>
size_t size_t
offset (util::view<T*> ptr) const offset (cruft::view<T*> ptr) const
{ {
return offset (ptr.data ()); return offset (ptr.data ());
} }

View File

@ -14,11 +14,11 @@
#include <cstddef> #include <cstddef>
namespace util::alloc::raw { namespace cruft::alloc::raw {
class malloc { class malloc {
public: public:
template <typename T> template <typename T>
util::view<T*> allocate (size_t count) cruft::view<T*> allocate (size_t count)
{ {
return { return {
reinterpret_cast<T*> (malloc (sizeof (T) * count)), reinterpret_cast<T*> (malloc (sizeof (T) * count)),
@ -27,7 +27,7 @@ namespace util::alloc::raw {
} }
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count, size_t align) allocate (size_t count, size_t align)
{ {
void* ptr; void* ptr;
@ -40,7 +40,7 @@ namespace util::alloc::raw {
template <typename T> template <typename T>
void void
deallocate (util::view<std::byte*> ptr) deallocate (cruft::view<std::byte*> ptr)
{ {
::free (ptr.data ()); ::free (ptr.data ());
} }

View File

@ -13,7 +13,7 @@
#include <new> #include <new>
using util::alloc::raw::null; using cruft::alloc::raw::null;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -14,7 +14,7 @@
#include <cstddef> #include <cstddef>
namespace util::alloc::raw { namespace cruft::alloc::raw {
// allocator that always fails, throwing bad_alloc. deallocate will // allocator that always fails, throwing bad_alloc. deallocate will
// succeed with nullptr as with delete, but is undefined with other values // succeed with nullptr as with delete, but is undefined with other values
// (it is likely to at least assert). // (it is likely to at least assert).
@ -25,14 +25,14 @@ namespace util::alloc::raw {
null& operator= (const null&) = delete; null& operator= (const null&) = delete;
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count) allocate (size_t count)
{ {
return allocate<T> (count, alignof (T)); return allocate<T> (count, alignof (T));
} }
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count, size_t align) allocate (size_t count, size_t align)
{ {
(void)count; (void)count;
@ -43,14 +43,14 @@ namespace util::alloc::raw {
template <typename T> template <typename T>
void void
deallocate (util::view<T*> ptr) deallocate (cruft::view<T*> ptr)
{ {
(void)ptr; (void)ptr;
CHECK_EQ (ptr.data (), static_cast<const void*> (nullptr)); CHECK_EQ (ptr.data (), static_cast<const void*> (nullptr));
} }
util::view<std::byte*> data (void); cruft::view<std::byte*> data (void);
util::view<const std::byte*> data (void) const; cruft::view<const std::byte*> data (void) const;
std::byte* begin (void); std::byte* begin (void);
const std::byte* begin (void) const; const std::byte* begin (void) const;

View File

@ -12,11 +12,11 @@
#include "../../pointer.hpp" #include "../../pointer.hpp"
#include "../../cast.hpp" #include "../../cast.hpp"
using util::alloc::raw::stack; using cruft::alloc::raw::stack;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
stack::stack (util::view<std::byte*> _data): stack::stack (cruft::view<std::byte*> _data):
m_begin (_data.begin ()), m_begin (_data.begin ()),
m_end (_data.end ()), m_end (_data.end ()),
m_cursor (m_begin) m_cursor (m_begin)

View File

@ -15,7 +15,7 @@
#include <cstddef> #include <cstddef>
namespace util::alloc::raw { namespace cruft::alloc::raw {
// allocate memory from a buffer in a stacklike manner. deallocation that // allocate memory from a buffer in a stacklike manner. deallocation that
// is not correctly ordered has undefined (read 'bad') results. // is not correctly ordered has undefined (read 'bad') results.
class stack { class stack {
@ -25,10 +25,10 @@ namespace util::alloc::raw {
stack& operator= (const stack&) = delete; stack& operator= (const stack&) = delete;
stack& operator= (stack&&) = delete; stack& operator= (stack&&) = delete;
stack (util::view<std::byte*> _data); stack (cruft::view<std::byte*> _data);
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count, size_t alignment) allocate (size_t count, size_t alignment)
{ {
constexpr auto MIN_ALIGNMENT = sizeof (record::offset_t); constexpr auto MIN_ALIGNMENT = sizeof (record::offset_t);
@ -39,8 +39,8 @@ namespace util::alloc::raw {
auto ptr = m_cursor + sizeof (record::offset_t); auto ptr = m_cursor + sizeof (record::offset_t);
// align the outgoing pointer if required // align the outgoing pointer if required
alignment = util::max (MIN_ALIGNMENT, alignment); alignment = cruft::max (MIN_ALIGNMENT, alignment);
ptr = util::align (ptr, alignment); ptr = cruft::align (ptr, alignment);
// ensure we haven't overrun our allocated segment // ensure we haven't overrun our allocated segment
if (ptr + bytes > m_end) if (ptr + bytes > m_end)
@ -51,15 +51,15 @@ namespace util::alloc::raw {
// (from the record struct). allows us to account for alignment. // (from the record struct). allows us to account for alignment.
record r; record r;
r.as_bytes = ptr - sizeof (record::offset_t); r.as_bytes = ptr - sizeof (record::offset_t);
*r.as_offset = util::cast::lossless <uint32_t> (ptr - m_cursor); *r.as_offset = cruft::cast::lossless <uint32_t> (ptr - m_cursor);
m_cursor = ptr + bytes; m_cursor = ptr + bytes;
return { util::cast::alignment<T*> (ptr), count }; return { cruft::cast::alignment<T*> (ptr), count };
} }
template <typename T> template <typename T>
util::view<T*> cruft::view<T*>
allocate (size_t count) allocate (size_t count)
{ {
return allocate<T> (count, alignof (T)); return allocate<T> (count, alignof (T));
@ -67,7 +67,7 @@ namespace util::alloc::raw {
template <typename T> template <typename T>
void deallocate (util::view<T*> _ptr) void deallocate (cruft::view<T*> _ptr)
{ {
auto ptr = reinterpret_cast<std::byte*> (_ptr.data ()); auto ptr = reinterpret_cast<std::byte*> (_ptr.data ());
@ -82,8 +82,8 @@ namespace util::alloc::raw {
} }
util::view<std::byte*> data (void); cruft::view<std::byte*> data (void);
util::view<const std::byte*> data (void) const; cruft::view<const std::byte*> data (void) const;
std::byte* begin (void); std::byte* begin (void);
const std::byte* begin (void) const; const std::byte* begin (void) const;

View File

@ -12,7 +12,7 @@
#include <type_traits> #include <type_traits>
namespace util::alloc::raw { namespace cruft::alloc::raw {
template <typename AllocT, typename = std::void_t<>> template <typename AllocT, typename = std::void_t<>>
struct has_aligned_allocate : std::false_type {}; struct has_aligned_allocate : std::false_type {};

View File

@ -14,7 +14,7 @@
#include <cstdint> #include <cstdint>
#include <stdexcept> #include <stdexcept>
namespace util::ascii { namespace cruft::ascii {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
constexpr inline constexpr inline
bool bool
@ -131,7 +131,7 @@ operator"" _hex2u8 (const char *str, size_t len)
std::vector<uint8_t> res (len/2); std::vector<uint8_t> res (len/2);
for (size_t i = 0; i < len; i += 2) for (size_t i = 0; i < len; i += 2)
res[i/2] = util::ascii::from_hex (str[i]) << 4 | util::ascii::from_hex (str[i+1]); res[i/2] = cruft::ascii::from_hex (str[i]) << 4 | cruft::ascii::from_hex (str[i+1]);
return res; return res;
}; };
@ -147,8 +147,8 @@ operator"" _hex2array (void)
constexpr CharT literal[] = { StrV... }; constexpr CharT literal[] = { StrV... };
for (size_t i = 0; i < res.size (); ++i) for (size_t i = 0; i < res.size (); ++i)
res[i] = util::ascii::from_hex (literal[i*2+0]) << 4 | res[i] = cruft::ascii::from_hex (literal[i*2+0]) << 4 |
util::ascii::from_hex (literal[i*2+1]); cruft::ascii::from_hex (literal[i*2+1]);
return res; return res;
} }

View File

@ -28,7 +28,7 @@ debug::backtrace::backtrace (void):
size_t last; size_t last;
size_t size = m_frames.size (); size_t size = m_frames.size ();
while ((last = ::backtrace (&m_frames[0], util::cast::lossless <int> (m_frames.size ()))) == size) while ((last = ::backtrace (&m_frames[0], cruft::cast::lossless <int> (m_frames.size ()))) == size)
m_frames.resize (size = m_frames.size () * 2); m_frames.resize (size = m_frames.size () * 2);
CHECK_GT (last, 0u); CHECK_GT (last, 0u);
@ -44,7 +44,7 @@ addr2line (const void *addr)
using pstream_t = std::unique_ptr<FILE,decltype(&::pclose)>; using pstream_t = std::unique_ptr<FILE,decltype(&::pclose)>;
std::ostringstream cmd; std::ostringstream cmd;
cmd << ADDR2LINE << " -e " << util::image_path () << ' ' << std::hex << addr; cmd << ADDR2LINE << " -e " << cruft::image_path () << ' ' << std::hex << addr;
pstream_t stream ( pstream_t stream (
::popen (cmd.str ().c_str (), "r"), ::popen (cmd.str ().c_str (), "r"),
@ -52,7 +52,7 @@ addr2line (const void *addr)
); );
// inefficient to copy from vector to string, but it's not a high priority path // inefficient to copy from vector to string, but it's not a high priority path
auto data = util::slurp<char> (stream.get ()); auto data = cruft::slurp<char> (stream.get ());
return std::string (data.cbegin (), data.cend ()); return std::string (data.cbegin (), data.cend ());
#else #else
@ -68,7 +68,7 @@ debug::operator <<(std::ostream &os, const debug::backtrace &rhs) {
// We don't use the array form of unique_ptr as clang fails on ambigious constructors // We don't use the array form of unique_ptr as clang fails on ambigious constructors
typedef std::unique_ptr<char *, decltype(&std::free)> str_t; typedef std::unique_ptr<char *, decltype(&std::free)> str_t;
str_t names (backtrace_symbols (frames.data (), util::cast::lossless <int> (frames.size ())), ::free); str_t names (backtrace_symbols (frames.data (), cruft::cast::lossless <int> (frames.size ())), ::free);
for (unsigned int i = 0; i < frames.size (); ++i) for (unsigned int i = 0; i < frames.size (); ++i)
os << frames[i] << '\t' << names.get()[i] << '\t' << addr2line (frames[i]); os << frames[i] << '\t' << names.get()[i] << '\t' << addr2line (frames[i]);

View File

@ -59,7 +59,7 @@ backtrace::backtrace ()
SymGetModuleBase64, SymGetModuleBase64,
nullptr)) nullptr))
{ {
util::win32::error::throw_code (); cruft::win32::error::throw_code ();
} }
// we've read the bottom of the stack // we've read the bottom of the stack

View File

@ -26,7 +26,7 @@ debug::backtrace::backtrace (void)
auto process = GetCurrentProcess(); auto process = GetCurrentProcess();
if (!SymInitialize (process, NULL, TRUE)) if (!SymInitialize (process, NULL, TRUE))
util::win32::error::throw_code (); cruft::win32::error::throw_code ();
while (true) { while (true) {
auto res = CaptureStackBackTrace (1, m_frames.size (), m_frames.data (), NULL); auto res = CaptureStackBackTrace (1, m_frames.size (), m_frames.data (), NULL);

View File

@ -19,7 +19,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t N> template <size_t N>
util::bezier<N>::bezier (const util::point2f (&_points)[N+1]) cruft::bezier<N>::bezier (const cruft::point2f (&_points)[N+1])
{ {
std::copy (_points, _points + N + 1, m_points); std::copy (_points, _points + N + 1, m_points);
} }
@ -31,7 +31,7 @@ util::bezier<N>::bezier (const util::point2f (&_points)[N+1])
// of other more comprehensive tests. // of other more comprehensive tests.
template <size_t N> template <size_t N>
size_t size_t
util::bezier<N>::intersections (point2f p0, point2f p1) const cruft::bezier<N>::intersections (point2f p0, point2f p1) const
{ {
float A = p1.y - p0.y; // A = y2 - y1 float A = p1.y - p0.y; // A = y2 - y1
float B = p0.x - p1.x; // B = x1 - x2 float B = p0.x - p1.x; // B = x1 - x2
@ -63,7 +63,7 @@ util::bezier<N>::intersections (point2f p0, point2f p1) const
continue; continue;
// Find the line's intersection point // Find the line's intersection point
const util::vector2f q = polynomial::eval (bcoeff, t); const cruft::vector2f q = polynomial::eval (bcoeff, t);
const auto s = almost_equal (p0.x, p1.x) ? const auto s = almost_equal (p0.x, p1.x) ?
(q.y-p0.y) / (p1.y-p0.y) : (q.y-p0.y) / (p1.y-p0.y) :
@ -80,8 +80,8 @@ util::bezier<N>::intersections (point2f p0, point2f p1) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t N> template <size_t N>
util::region2f cruft::region2f
util::bezier<N>::region (void) const cruft::bezier<N>::region (void) const
{ {
float x0 = m_points[0].x; float x0 = m_points[0].x;
float y0 = m_points[0].y; float y0 = m_points[0].y;
@ -97,8 +97,8 @@ util::bezier<N>::region (void) const
y1 = max (y1, m_points[i].y); y1 = max (y1, m_points[i].y);
} }
util::point2f p0 { x0, y0 }; cruft::point2f p0 { x0, y0 };
util::point2f p1 { x1, y1 }; cruft::point2f p1 { x1, y1 };
return { p0, p1 }; return { p0, p1 };
} }
@ -106,8 +106,8 @@ util::bezier<N>::region (void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t N> template <size_t N>
util::point2f& cruft::point2f&
util::bezier<N>::operator[] (size_t idx) cruft::bezier<N>::operator[] (size_t idx)
{ {
CHECK_LE (idx, N); CHECK_LE (idx, N);
@ -117,8 +117,8 @@ util::bezier<N>::operator[] (size_t idx)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t N> template <size_t N>
const util::point2f& const cruft::point2f&
util::bezier<N>::operator[] (size_t idx) const cruft::bezier<N>::operator[] (size_t idx) const
{ {
CHECK_LE (idx, N); CHECK_LE (idx, N);
@ -128,8 +128,8 @@ util::bezier<N>::operator[] (size_t idx) const
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t N> template <size_t N>
const util::point2f* const cruft::point2f*
util::bezier<N>::begin (void) const cruft::bezier<N>::begin (void) const
{ {
return std::cbegin (m_points); return std::cbegin (m_points);
} }
@ -137,8 +137,8 @@ util::bezier<N>::begin (void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t N> template <size_t N>
const util::point2f* const cruft::point2f*
util::bezier<N>::end (void) const cruft::bezier<N>::end (void) const
{ {
return std::cend (m_points); return std::cend (m_points);
} }
@ -146,8 +146,8 @@ util::bezier<N>::end (void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t N> template <size_t N>
const util::point2f* const cruft::point2f*
util::bezier<N>::cbegin (void) const cruft::bezier<N>::cbegin (void) const
{ {
return std::cbegin (m_points); return std::cbegin (m_points);
} }
@ -155,8 +155,8 @@ util::bezier<N>::cbegin (void) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t N> template <size_t N>
const util::point2f* const cruft::point2f*
util::bezier<N>::cend (void) const cruft::bezier<N>::cend (void) const
{ {
return std::cend (m_points); return std::cend (m_points);
} }
@ -165,7 +165,7 @@ util::bezier<N>::cend (void) const
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t N> template <size_t N>
std::ostream& std::ostream&
util::operator<< (std::ostream &os, const bezier<N> &b) cruft::operator<< (std::ostream &os, const bezier<N> &b)
{ {
using value_type = decltype(*b.cbegin()); using value_type = decltype(*b.cbegin());
@ -182,8 +182,8 @@ util::operator<< (std::ostream &os, const bezier<N> &b)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define INSTANTIATE(N) \ #define INSTANTIATE(N) \
template class util::bezier<N>; \ template class cruft::bezier<N>; \
template std::ostream& util::operator<< (std::ostream&, const bezier<N>&); template std::ostream& cruft::operator<< (std::ostream&, const bezier<N>&);
INSTANTIATE(1) INSTANTIATE(1)
INSTANTIATE(2) INSTANTIATE(2)

View File

@ -14,7 +14,7 @@
#include <iosfwd> #include <iosfwd>
namespace util { namespace cruft {
struct sdot_t { struct sdot_t {
float distance; float distance;
float dot; float dot;
@ -25,7 +25,7 @@ namespace util {
public: public:
using value_type = point2f::value_type; using value_type = point2f::value_type;
bezier (const util::point2f (&)[N+1]); bezier (const cruft::point2f (&)[N+1]);
point2f eval (float t) const; point2f eval (float t) const;
@ -35,11 +35,11 @@ namespace util {
size_t intersections (point2f from, point2f to) const; size_t intersections (point2f from, point2f to) const;
util::vector2f tangent (float t) const; cruft::vector2f tangent (float t) const;
// 1st derivative w.r.t. t // 1st derivative w.r.t. t
util::vector2f d1 (float t) const noexcept; cruft::vector2f d1 (float t) const noexcept;
// 2nd derivative w.r.t. t // 2nd derivative w.r.t. t
util::vector2f d2 (float t) const noexcept; cruft::vector2f d2 (float t) const noexcept;
float closest (point2f) const noexcept; float closest (point2f) const noexcept;

View File

@ -12,7 +12,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
point2f point2f
bezier<1>::eval (float t) const bezier<1>::eval (float t) const
@ -33,20 +33,20 @@ namespace util {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
constexpr constexpr
util::vector2f cruft::vector2f
orthonormal (util::vector2f v) orthonormal (cruft::vector2f v)
{ {
const auto len = norm (v); const auto len = norm (v);
CHECK_NEZ (len); CHECK_NEZ (len);
return util::vector2f { -v.y / len, v.x / len }; return cruft::vector2f { -v.y / len, v.x / len };
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
float float
bezier<1>::closest (util::point2f q) const noexcept bezier<1>::closest (cruft::point2f q) const noexcept
{ {
const auto ab = m_points[1] - m_points[0]; const auto ab = m_points[1] - m_points[0];
const auto aq = q - m_points[0]; const auto aq = q - m_points[0];
@ -57,22 +57,22 @@ namespace util {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
float float
bezier<1>::distance (util::point2f q) const noexcept bezier<1>::distance (cruft::point2f q) const noexcept
{ {
const auto ab = m_points[1] - m_points[0]; const auto ab = m_points[1] - m_points[0];
const auto t = clamp (closest (q), 0.f, 1.f); const auto t = clamp (closest (q), 0.f, 1.f);
const auto p = m_points[0] + t * ab; const auto p = m_points[0] + t * ab;
return util::distance (q, p); return cruft::distance (q, p);
} }
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
sdot_t sdot_t
bezier<1>::sdot (const point2f q) const noexcept bezier<1>::sdot (const point2f q) const noexcept
@ -88,7 +88,7 @@ namespace util {
// if we're on the segment return the distance to the segment // if we're on the segment return the distance to the segment
if (t >= 0 && t <= 1) { if (t >= 0 && t <= 1) {
const auto ortho = util::vector2f { -ab.y, ab.x } / norm (ab); const auto ortho = cruft::vector2f { -ab.y, ab.x } / norm (ab);
const auto d = dot (ortho, qa); const auto d = dot (ortho, qa);
// not _entirely_ sure why we need this condition // not _entirely_ sure why we need this condition
@ -109,9 +109,9 @@ namespace util {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
std::array<util::vector2f,2> std::array<cruft::vector2f,2>
bezier<1>::coeffs (void) const bezier<1>::coeffs (void) const
{ {
auto &v = m_coeffs; auto &v = m_coeffs;

View File

@ -13,7 +13,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
point2f point2f
bezier<2>::eval (float t) const bezier<2>::eval (float t) const
@ -28,15 +28,15 @@ namespace util {
(1 - t) * (1 - t) * P0 + (1 - t) * (1 - t) * P0 +
2 * (1 - t) * t * P1 + 2 * (1 - t) * t * P1 +
t * t * P2 t * t * P2
).as<util::point> (); ).as<cruft::point> ();
} }
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
std::array<util::vector2f,3> std::array<cruft::vector2f,3>
bezier<2>::coeffs (void) const bezier<2>::coeffs (void) const
{ {
auto &v = m_coeffs; auto &v = m_coeffs;
@ -51,9 +51,9 @@ namespace util {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
util::vector2f cruft::vector2f
bezier<2>::d1 (const float t) const noexcept bezier<2>::d1 (const float t) const noexcept
{ {
CHECK_LIMIT (t, 0.f, 1.f); CHECK_LIMIT (t, 0.f, 1.f);
@ -69,7 +69,7 @@ namespace util {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
sdot_t sdot_t
bezier<2>::sdot (point2f q) const noexcept bezier<2>::sdot (point2f q) const noexcept
@ -167,10 +167,10 @@ namespace util {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
float float
bezier<2>::distance (util::point2f q) const noexcept bezier<2>::distance (cruft::point2f q) const noexcept
{ {
return abs (sdot (q).distance); return abs (sdot (q).distance);
} }

View File

@ -14,7 +14,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
point2f point2f
bezier<3>::eval (float t) const bezier<3>::eval (float t) const
@ -36,9 +36,9 @@ namespace util {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
std::array<util::vector2f,4> std::array<cruft::vector2f,4>
bezier<3>::coeffs (void) const bezier<3>::coeffs (void) const
{ {
const auto &v = m_coeffs; const auto &v = m_coeffs;
@ -54,8 +54,8 @@ namespace util {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
float refine_cubic (util::bezier<3> b, float refine_cubic (cruft::bezier<3> b,
util::point2f target, cruft::point2f target,
float t, float t,
float d, float d,
float p) float p)
@ -68,11 +68,11 @@ float refine_cubic (util::bezier<3> b,
float t_l = std::max (0.f, t - p); float t_l = std::max (0.f, t - p);
float t_r = std::min (1.f, t + p); float t_r = std::min (1.f, t + p);
util::point2f p_l = b.eval (t_l); cruft::point2f p_l = b.eval (t_l);
util::point2f p_r = b.eval (t_r); cruft::point2f p_r = b.eval (t_r);
float d_l = util::distance (target, p_l); float d_l = cruft::distance (target, p_l);
float d_r = util::distance (target, p_r); float d_r = cruft::distance (target, p_r);
if (d_l < d) { return refine_cubic (b, target, t_l, d_l, p); } if (d_l < d) { return refine_cubic (b, target, t_l, d_l, p); }
if (d_r < d) { return refine_cubic (b, target, t_r, d_r, p); } if (d_r < d) { return refine_cubic (b, target, t_r, d_r, p); }
@ -82,22 +82,22 @@ float refine_cubic (util::bezier<3> b,
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
// TODO: use a more reliable method like [Xiao-Dia Chen 2010] // TODO: use a more reliable method like [Xiao-Dia Chen 2010]
template <> template <>
float float
bezier<3>::distance (util::point2f target) const noexcept bezier<3>::distance (cruft::point2f target) const noexcept
{ {
static constexpr int SUBDIV = 32; static constexpr int SUBDIV = 32;
std::array<util::point2f, SUBDIV> lookup; std::array<cruft::point2f, SUBDIV> lookup;
for (int i = 0; i < SUBDIV; ++i) for (int i = 0; i < SUBDIV; ++i)
lookup[i] = eval (i / (SUBDIV - 1.f)); lookup[i] = eval (i / (SUBDIV - 1.f));
size_t best = 0; size_t best = 0;
for (size_t i = 1; i < lookup.size (); ++i) { for (size_t i = 1; i < lookup.size (); ++i) {
auto d_i = util::distance2 (target, lookup[i]); auto d_i = cruft::distance2 (target, lookup[i]);
auto d_b = util::distance2 (target, lookup[best]); auto d_b = cruft::distance2 (target, lookup[best]);
if (d_i < d_b) if (d_i < d_b)
best = i; best = i;
@ -106,16 +106,16 @@ namespace util {
return refine_cubic (*this, return refine_cubic (*this,
target, target,
best / float (SUBDIV - 1), best / float (SUBDIV - 1),
util::distance (target, lookup[best]), cruft::distance (target, lookup[best]),
1.f / SUBDIV); 1.f / SUBDIV);
} }
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
util::vector2f cruft::vector2f
bezier<3>::tangent (const float t) const bezier<3>::tangent (const float t) const
{ {
CHECK_LIMIT (t, 0.f, 1.f); CHECK_LIMIT (t, 0.f, 1.f);
@ -130,9 +130,9 @@ namespace util {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
util::vector2f cruft::vector2f
bezier<3>::d1 (const float t) const noexcept bezier<3>::d1 (const float t) const noexcept
{ {
const auto &P0 = m_points[0]; const auto &P0 = m_points[0];
@ -148,9 +148,9 @@ namespace util {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util { namespace cruft {
template <> template <>
util::vector2f cruft::vector2f
bezier<3>::d2 (const float t) const noexcept bezier<3>::d2 (const float t) const noexcept
{ {
const auto &P0 = m_points[0]; const auto &P0 = m_points[0];
@ -165,7 +165,7 @@ namespace util {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <> template <>
sdot_t sdot_t
bezier<3>::sdot (point2f src) const noexcept bezier<3>::sdot (point2f src) const noexcept
@ -180,14 +180,14 @@ namespace util {
float t = std::numeric_limits<float>::quiet_NaN (); float t = std::numeric_limits<float>::quiet_NaN ();
// distance from A // distance from A
const auto d_a = util::sign (cross (ab, qa)) * norm (qa); const auto d_a = cruft::sign (cross (ab, qa)) * norm (qa);
if (abs (d_a) < abs (d)) { if (abs (d_a) < abs (d)) {
d = d_a; d = d_a;
t = -dot (ab, qa) / norm2 (ab); t = -dot (ab, qa) / norm2 (ab);
} }
// distance from D // distance from D
const auto d_d = util::sign (cross (cd, qd)) * norm (qd); const auto d_d = cruft::sign (cross (cd, qd)) * norm (qd);
if (abs (d_d) < abs (d)) { if (abs (d_d) < abs (d)) {
d = d_d; d = d_d;
t = -dot (cd, qd) / norm2 (cd); t = -dot (cd, qd) / norm2 (cd);

View File

@ -16,7 +16,7 @@
#include <cstdint> #include <cstdint>
namespace util { namespace cruft {
const uint8_t BITMASK_1BITS = 0x01; const uint8_t BITMASK_1BITS = 0x01;
const uint8_t BITMASK_2BITS = 0x03; const uint8_t BITMASK_2BITS = 0x03;
const uint8_t BITMASK_3BITS = 0x07; const uint8_t BITMASK_3BITS = 0x07;

View File

@ -15,7 +15,7 @@
#include <limits> #include <limits>
namespace util::cast { namespace cruft::cast {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/// Safely cast a numeric type to its (un)signed counterpart, aborting if /// Safely cast a numeric type to its (un)signed counterpart, aborting if
/// the dynamically checked result is not representable. May be optimised /// the dynamically checked result is not representable. May be optimised

View File

@ -15,8 +15,8 @@
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
using namespace util::cmdopt; using namespace cruft::cmdopt;
using namespace util::cmdopt::option; using namespace cruft::cmdopt::option;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -147,7 +147,7 @@ present::finish (void)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util::cmdopt::option { namespace cruft::cmdopt::option {
template class value<uint16_t>; template class value<uint16_t>;
template class value<uint32_t>; template class value<uint32_t>;
template class value<uint64_t>; template class value<uint64_t>;
@ -172,7 +172,7 @@ count<T>::execute (void)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
namespace util::cmdopt::option { namespace cruft::cmdopt::option {
template class count<unsigned>; template class count<unsigned>;
} }
@ -184,27 +184,27 @@ suffix_to_multiplier (char c)
switch (c) { switch (c) {
case 'e': case 'e':
case 'E': case 'E':
return util::pow (1024UL, 6u); return cruft::pow (1024UL, 6u);
case 'p': case 'p':
case 'P': case 'P':
return util::pow (1024UL, 5u); return cruft::pow (1024UL, 5u);
case 't': case 't':
case 'T': case 'T':
return util::pow (1024UL, 4u); return cruft::pow (1024UL, 4u);
case 'g': case 'g':
case 'G': case 'G':
return util::pow (1024UL, 3u); return cruft::pow (1024UL, 3u);
case 'm': case 'm':
case 'M': case 'M':
return util::pow (1024UL, 2u); return cruft::pow (1024UL, 2u);
case 'k': case 'k':
case 'K': case 'K':
return util::pow (1024UL, 1u); return cruft::pow (1024UL, 1u);
default: default:
const char str[2] = { c, '\0' }; const char str[2] = { c, '\0' };
@ -426,13 +426,13 @@ parser::print_help (const int argc,
else else
std::cout << '\t'; std::cout << '\t';
std::cout << std::setw (util::cast::lossless<int> (longwidth)); std::cout << std::setw (cruft::cast::lossless<int> (longwidth));
if (l != std::cend (m_long)) if (l != std::cend (m_long))
std::cout << l->first << '\t'; std::cout << l->first << '\t';
else else
std::cout << ' ' << '\t'; std::cout << ' ' << '\t';
std::cout << std::setw (util::cast::lossless<int> (longexample)) << opt.handler->example () << '\t' std::cout << std::setw (cruft::cast::lossless<int> (longexample)) << opt.handler->example () << '\t'
<< std::setw (0) << opt.description << std::setw (0) << opt.description
<< '\n'; << '\n';
} }

View File

@ -24,7 +24,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::cmdopt { namespace cruft::cmdopt {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
class error : public std::exception { }; class error : public std::exception { };

View File

@ -13,8 +13,8 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
static util::srgba4f static cruft::srgba4f
parse_hex (util::view<const char*> str) parse_hex (cruft::view<const char*> str)
{ {
if (str.size () != strlen ("#012345")) if (str.size () != strlen ("#012345"))
throw std::invalid_argument ("expected length of 7"); throw std::invalid_argument ("expected length of 7");
@ -22,29 +22,29 @@ parse_hex (util::view<const char*> str)
if (str[0] != '#') if (str[0] != '#')
throw std::invalid_argument ("expected leading '#'"); throw std::invalid_argument ("expected leading '#'");
if (!util::ascii::is_hex (str[1]) || if (!cruft::ascii::is_hex (str[1]) ||
!util::ascii::is_hex (str[2]) || !cruft::ascii::is_hex (str[2]) ||
!util::ascii::is_hex (str[3]) || !cruft::ascii::is_hex (str[3]) ||
!util::ascii::is_hex (str[4]) || !cruft::ascii::is_hex (str[4]) ||
!util::ascii::is_hex (str[5]) || !cruft::ascii::is_hex (str[5]) ||
!util::ascii::is_hex (str[6])) !cruft::ascii::is_hex (str[6]))
{ {
throw std::invalid_argument ("expected hex digits"); throw std::invalid_argument ("expected hex digits");
} }
uint8_t r = util::ascii::from_hex (str[1]) << 4u | util::ascii::from_hex (str[2]); uint8_t r = cruft::ascii::from_hex (str[1]) << 4u | cruft::ascii::from_hex (str[2]);
uint8_t g = util::ascii::from_hex (str[3]) << 4u | util::ascii::from_hex (str[4]); uint8_t g = cruft::ascii::from_hex (str[3]) << 4u | cruft::ascii::from_hex (str[4]);
uint8_t b = util::ascii::from_hex (str[5]) << 4u | util::ascii::from_hex (str[6]); uint8_t b = cruft::ascii::from_hex (str[5]) << 4u | cruft::ascii::from_hex (str[6]);
return util::srgba<4,uint8_t> { r, g, b, 255 }.template cast<float> (); return cruft::srgba<4,uint8_t> { r, g, b, 255 }.template cast<float> ();
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <> template <>
util::srgba4f cruft::srgba4f
util::parse<util::srgba4f> (util::view<const char*> str) cruft::parse<cruft::srgba4f> (cruft::view<const char*> str)
{ {
return parse_hex (str); return parse_hex (str);
} }

View File

@ -16,7 +16,7 @@
#include <type_traits> #include <type_traits>
namespace util { namespace cruft {
/// An abstract colour POD type componsed of S components of type T. /// 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. /// Not to be used directly, instead the use of derived types is required.
@ -33,7 +33,7 @@ namespace util {
auto auto
cast (void) const cast (void) const
{ {
::util::revalue_t<SelfT,U> ret; ::cruft::revalue_t<SelfT,U> ret;
std::transform (std::begin (*this), std::transform (std::begin (*this),
std::end (*this), std::end (*this),
std::begin (ret), std::begin (ret),
@ -43,21 +43,21 @@ namespace util {
}; };
template <typename T> template <typename T>
struct util::coord::store<1,T,srgba<1,T>> { struct cruft::coord::store<1,T,srgba<1,T>> {
union { union {
struct { T r; }; struct { T r; };
T data[1]; T data[1];
}; };
}; };
template <typename T> template <typename T>
struct util::coord::store<2,T,srgba<2,T>> { struct cruft::coord::store<2,T,srgba<2,T>> {
union { union {
struct { T r, g; }; struct { T r, g; };
T data[2]; T data[2];
}; };
}; };
template <typename T> template <typename T>
struct util::coord::store<3,T,srgba<3,T>> { struct cruft::coord::store<3,T,srgba<3,T>> {
union { union {
struct { T r, g, b; }; struct { T r, g, b; };
T data[3]; T data[3];
@ -65,7 +65,7 @@ namespace util {
}; };
template <typename T> template <typename T>
struct util::coord::store<4,T,srgba<4,T>> { struct cruft::coord::store<4,T,srgba<4,T>> {
union { union {
struct { T r, g, b, a; }; struct { T r, g, b, a; };
T data[4]; T data[4];

View File

@ -22,7 +22,7 @@
#include <type_traits> #include <type_traits>
namespace util::coord { namespace cruft::coord {
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// the base class for all coordinate-like types. // the base class for all coordinate-like types.
// //

View File

@ -11,7 +11,7 @@
#include <cstddef> #include <cstddef>
namespace util { namespace cruft {
namespace coord { namespace coord {
template <size_t S,typename T,typename ParentT> struct store; template <size_t S,typename T,typename ParentT> struct store;
template <size_t,typename,typename> struct init; template <size_t,typename,typename> struct init;

View File

@ -13,7 +13,7 @@
#include <cstddef> #include <cstddef>
namespace util::coord { namespace cruft::coord {
template <size_t S, typename T, typename SelfT> template <size_t S, typename T, typename SelfT>
struct init; struct init;

View File

@ -16,7 +16,7 @@
#include <ostream> #include <ostream>
#include <algorithm> #include <algorithm>
namespace util { namespace cruft {
template < template <
typename K, typename K,
typename = std::enable_if_t<is_coord_v<K>,void> typename = std::enable_if_t<is_coord_v<K>,void>

View File

@ -27,7 +27,7 @@
#include <functional> #include <functional>
namespace util { namespace cruft {
/// returns the data at a templated index in a coordinate. /// returns the data at a templated index in a coordinate.
/// ///
/// specifically required for structured bindings support. /// specifically required for structured bindings support.
@ -485,7 +485,7 @@ namespace util {
return RetT { return RetT {
std::apply ( std::apply (
func, func,
::util::tuple::value::map ( ::cruft::tuple::value::map (
static_cast< static_cast<
const value_t& (&)(const part_t&) const value_t& (&)(const part_t&)
> ( > (
@ -1078,7 +1078,7 @@ namespace util {
constexpr auto constexpr auto
sum (const K &k) sum (const K &k)
{ {
// DO NOT USE util::sum(begin, end) from maths.hpp // DO NOT USE cruft::sum(begin, end) from maths.hpp
// //
// It would be nice to use kahan summation from maths.hpp but speed // It would be nice to use kahan summation from maths.hpp but speed
// and simplicity is more important for these fixed sized // and simplicity is more important for these fixed sized
@ -1475,7 +1475,7 @@ namespace std {
template <std::size_t,typename> typename K template <std::size_t,typename> typename K
> >
class tuple_size<K<S,T>> : public std::enable_if_t< class tuple_size<K<S,T>> : public std::enable_if_t<
::util::is_coord_v<K<S,T>>, ::cruft::is_coord_v<K<S,T>>,
std::integral_constant<std::size_t, S> std::integral_constant<std::size_t, S>
> { }; > { };
@ -1495,7 +1495,7 @@ namespace std {
template <std::size_t,typename> typename K template <std::size_t,typename> typename K
> >
class tuple_element<I,K<S,T>> : public std::enable_if< class tuple_element<I,K<S,T>> : public std::enable_if<
::util::is_coord_v<K<S,T>>, ::cruft::is_coord_v<K<S,T>>,
T T
> {}; > {};
} }
@ -1513,13 +1513,13 @@ namespace std {
template <std::size_t,typename> typename K template <std::size_t,typename> typename K
> >
struct hash<K<S,T>> : enable_if< struct hash<K<S,T>> : enable_if<
::util::is_coord_v<K<S,T>> ::cruft::is_coord_v<K<S,T>>
> { > {
uint32_t operator() (K<S,T> k) const { uint32_t operator() (K<S,T> k) const {
uint32_t v = 0xdeadbeef; uint32_t v = 0xdeadbeef;
for (T t: k) for (T t: k)
v = ::util::hash::mix (t, v); v = ::cruft::hash::mix (t, v);
return v; return v;
} }
@ -1530,12 +1530,12 @@ namespace std {
template < template <
typename CoordT, typename CoordT,
typename = std::enable_if_t< typename = std::enable_if_t<
::util::is_coord_v<CoordT>, void ::cruft::is_coord_v<CoordT>, void
> >
> >
auto cos (CoordT val) auto cos (CoordT val)
{ {
return ::util::invoke<CoordT> (::util::cos<typename CoordT::value_type>, val); return ::cruft::invoke<CoordT> (::cruft::cos<typename CoordT::value_type>, val);
} }
@ -1543,12 +1543,12 @@ namespace std {
template < template <
typename CoordT, typename CoordT,
typename = std::enable_if_t< typename = std::enable_if_t<
::util::is_coord_v<CoordT>, void ::cruft::is_coord_v<CoordT>, void
> >
> >
auto sin (CoordT val) auto sin (CoordT val)
{ {
return ::util::invoke<CoordT> (::util::sin<typename CoordT::value_type>, val); return ::cruft::invoke<CoordT> (::cruft::sin<typename CoordT::value_type>, val);
} }
}; };

View File

@ -14,7 +14,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
util::coord::operator<< (std::ostream &os, simd<S,T> val) cruft::coord::operator<< (std::ostream &os, simd<S,T> val)
{ {
return os << "[ " return os << "[ "
<< val[0] << ", " << val[0] << ", "

View File

@ -12,7 +12,7 @@
#include "arm_neon.h" #include "arm_neon.h"
namespace util::coord { namespace cruft::coord {
struct alignas (16) simd { struct alignas (16) simd {
using value_type = float32x4_t; using value_type = float32x4_t;

View File

@ -22,7 +22,7 @@
#include <iosfwd> #include <iosfwd>
namespace util::coord { namespace cruft::coord {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
constexpr int alignment = 16; constexpr int alignment = 16;

View File

@ -21,7 +21,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Calculate a reasonable alignment for the given type and arity given what we // Calculate a reasonable alignment for the given type and arity given what we
// know about the platform. Only intended to be used with alignas specifiers. // know about the platform. Only intended to be used with alignas specifiers.
namespace util::coord::detail { namespace cruft::coord::detail {
template <typename T> template <typename T>
constexpr constexpr
std::size_t std::size_t
@ -45,13 +45,13 @@ namespace util::coord::detail {
} }
} }
#define SIMD_ALIGN(S,T) alignas (util::coord::detail::alignment<T> (S)) #define SIMD_ALIGN(S,T) alignas (cruft::coord::detail::alignment<T> (S))
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// defines the named member variables that a coordinate type is composed of // defines the named member variables that a coordinate type is composed of
#define DEFINE_COORD_STORE(TAG,...) \ #define DEFINE_COORD_STORE(TAG,...) \
namespace util::coord { \ namespace cruft::coord { \
template <typename T> \ template <typename T> \
struct store< \ struct store< \
VA_ARGS_COUNT(__VA_ARGS__), \ VA_ARGS_COUNT(__VA_ARGS__), \
@ -70,10 +70,10 @@ namespace util::coord { \
#define DEFINE_STORE(KLASS,...) \ #define DEFINE_STORE(KLASS,...) \
template <typename T> \ template <typename T> \
struct util::coord::store< \ struct cruft::coord::store< \
VA_ARGS_COUNT(__VA_ARGS__), \ VA_ARGS_COUNT(__VA_ARGS__), \
T, \ T, \
::util::KLASS< \ ::cruft::KLASS< \
VA_ARGS_COUNT(__VA_ARGS__), \ VA_ARGS_COUNT(__VA_ARGS__), \
T \ T \
> \ > \
@ -100,7 +100,7 @@ DEFINE_STORE(vector, x, y, z, w)
#undef DEFINE_STORE #undef DEFINE_STORE
namespace util::coord { namespace cruft::coord {
template <size_t S, typename T, typename SelfT> template <size_t S, typename T, typename SelfT>
struct store { struct store {
T data[S]; T data[S];
@ -110,57 +110,57 @@ namespace util::coord {
#if 0 #if 0
template <typename T> template <typename T>
struct util::coord::store<1,T,::util::extent<1,T>> { struct cruft::coord::store<1,T,::cruft::extent<1,T>> {
union { T data[1]; struct { T w; }; }; union { T data[1]; struct { T w; }; };
}; };
template <typename T> template <typename T>
struct util::coord::store<2,T,::util::extent<2,T>> { struct cruft::coord::store<2,T,::cruft::extent<2,T>> {
union { struct { T w, h; }; T data[2]; }; union { struct { T w, h; }; T data[2]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<3,T,::util::extent<3,T>> { struct cruft::coord::store<3,T,::cruft::extent<3,T>> {
union { struct { T w, h, d; }; T data[3]; }; union { struct { T w, h, d; }; T data[3]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<1,T,::util::point<1,T>> { struct cruft::coord::store<1,T,::cruft::point<1,T>> {
union { struct { T x; }; T data[1]; }; union { struct { T x; }; T data[1]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<2,T,::util::point<2,T>> { struct cruft::coord::store<2,T,::cruft::point<2,T>> {
union { struct { T x, y; }; T data[2]; }; union { struct { T x, y; }; T data[2]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<3,T,::util::point<3,T>> { struct cruft::coord::store<3,T,::cruft::point<3,T>> {
union { struct { T x, y, z; }; T data[3]; }; union { struct { T x, y, z; }; T data[3]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<4,T,::util::point<4,T>> { struct cruft::coord::store<4,T,::cruft::point<4,T>> {
union { struct { T x, y, z, w; }; T data[4]; }; union { struct { T x, y, z, w; }; T data[4]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<1,T,::util::vector<1,T>> { struct cruft::coord::store<1,T,::cruft::vector<1,T>> {
union { struct { T x; }; T data[1]; }; union { struct { T x; }; T data[1]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<2,T,::util::vector<2,T>> { struct cruft::coord::store<2,T,::cruft::vector<2,T>> {
union { struct { T x, y; }; T data[2]; }; union { struct { T x, y; }; T data[2]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<3,T,::util::vector<3,T>> { struct cruft::coord::store<3,T,::cruft::vector<3,T>> {
union { struct { T x, y, z; }; T data[3]; }; union { struct { T x, y, z; }; T data[3]; };
}; };
template <typename T> template <typename T>
struct util::coord::store<4,T,::util::vector<4,T>> { struct cruft::coord::store<4,T,::cruft::vector<4,T>> {
union { struct { T x, y, z, w; }; T data[4]; }; union { struct { T x, y, z, w; }; T data[4]; };
}; };
#endif #endif

View File

@ -14,7 +14,7 @@
#include <cstddef> #include <cstddef>
#include <type_traits> #include <type_traits>
namespace util { namespace cruft {
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// operation traits // operation traits
template <typename, typename> template <typename, typename>

32
cpp.cpp
View File

@ -13,9 +13,9 @@
#include "io.hpp" #include "io.hpp"
#include "cast.hpp" #include "cast.hpp"
using util::cpp::include; using cruft::cpp::include;
using util::cpp::passthrough; using cruft::cpp::passthrough;
using util::cpp::processor; using cruft::cpp::processor;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -40,21 +40,21 @@ processor::add (std::string token, std::unique_ptr<directive> handler)
void void
processor::process (std::ostream &os, const std::experimental::filesystem::path &src) const processor::process (std::ostream &os, const std::experimental::filesystem::path &src) const
{ {
const auto data = util::slurp<char> (src); const auto data = cruft::slurp<char> (src);
context ctx; context ctx;
ctx.source.push (src); ctx.source.push (src);
util::tokeniser<const char*> tok (data, '\n'); cruft::tokeniser<const char*> tok (data, '\n');
process (os, ctx, util::view (tok.begin (), tok.end ())); process (os, ctx, cruft::view (tok.begin (), tok.end ()));
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
util::tokeniser<const char*>::iterator cruft::tokeniser<const char*>::iterator
processor::process ( processor::process (
std::ostream &os, std::ostream &os,
context &ctx, context &ctx,
util::view<util::tokeniser<const char*>::iterator> lines) const cruft::view<cruft::tokeniser<const char*>::iterator> lines) const
{ {
for (auto l = lines.begin (), last = lines.end (); l != last; ++l) { for (auto l = lines.begin (), last = lines.end (); l != last; ++l) {
if (l->empty () || (*l)[0] != '#') { if (l->empty () || (*l)[0] != '#') {
@ -62,7 +62,7 @@ processor::process (
continue; continue;
} }
auto tokens = util::tokeniser (*l, ' '); auto tokens = cruft::tokeniser (*l, ' ');
auto head = tokens.begin (); auto head = tokens.begin ();
auto head_string = std::string { head->begin () + 1, head->size () - 1 }; auto head_string = std::string { head->begin () + 1, head->size () - 1 };
@ -125,10 +125,10 @@ passthrough::passthrough (const std::string &name):
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
util::tokeniser<const char*>::iterator cruft::tokeniser<const char*>::iterator
passthrough::process (std::ostream &os, passthrough::process (std::ostream &os,
context&, context&,
util::view<util::tokeniser<const char*>::iterator> lines) const cruft::view<cruft::tokeniser<const char*>::iterator> lines) const
{ {
os << *lines.begin () << '\n'; os << *lines.begin () << '\n';
return lines.begin ()++; return lines.begin ()++;
@ -142,20 +142,20 @@ include::include (processor &_parent):
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
util::tokeniser<const char*>::iterator cruft::tokeniser<const char*>::iterator
include::process (std::ostream &os, include::process (std::ostream &os,
context &ctx, context &ctx,
util::view<util::tokeniser<const char*>::iterator> lines) const cruft::view<cruft::tokeniser<const char*>::iterator> lines) const
{ {
const auto name = lines.begin ()->slice (strlen("#include '"), -2); const auto name = lines.begin ()->slice (strlen("#include '"), -2);
std::experimental::filesystem::path fragment { name.begin (), name.end () }; std::experimental::filesystem::path fragment { name.begin (), name.end () };
const auto target = ctx.source.top ().parent_path () / fragment; const auto target = ctx.source.top ().parent_path () / fragment;
const auto data = util::slurp<char> (target); const auto data = cruft::slurp<char> (target);
ctx.source.push (target); ctx.source.push (target);
util::tokeniser<const char*> tok (data, '\n'); cruft::tokeniser<const char*> tok (data, '\n');
m_parent.process (os, ctx, util::view (tok.begin (), tok.end ())); m_parent.process (os, ctx, cruft::view (tok.begin (), tok.end ()));
ctx.source.pop (); ctx.source.pop ();

22
cpp.hpp
View File

@ -18,7 +18,7 @@
#include <stdexcept> #include <stdexcept>
#include <stack> #include <stack>
namespace util::cpp { namespace cruft::cpp {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
struct context { struct context {
std::stack<std::experimental::filesystem::path> source; std::stack<std::experimental::filesystem::path> source;
@ -39,10 +39,10 @@ namespace util::cpp {
/// ///
/// \param lines is a tokenised view over all the lines of the input /// \param lines is a tokenised view over all the lines of the input
/// \return the next line that processing should continue from /// \return the next line that processing should continue from
virtual util::tokeniser<const char*>::iterator virtual cruft::tokeniser<const char*>::iterator
process (std::ostream&, process (std::ostream&,
context&, context&,
util::view<util::tokeniser<const char*>::iterator> lines) const = 0; cruft::view<cruft::tokeniser<const char*>::iterator> lines) const = 0;
}; };
@ -57,10 +57,10 @@ namespace util::cpp {
std::experimental::filesystem::path std::experimental::filesystem::path
resolve (const std::experimental::filesystem::path&) const; resolve (const std::experimental::filesystem::path&) const;
util::tokeniser<const char*>::iterator cruft::tokeniser<const char*>::iterator
process (std::ostream&, process (std::ostream&,
context&, context&,
util::view<util::tokeniser<const char*>::iterator>) const; cruft::view<cruft::tokeniser<const char*>::iterator>) const;
private: private:
std::map<std::string, std::unique_ptr<directive>> m_directives; std::map<std::string, std::unique_ptr<directive>> m_directives;
@ -79,10 +79,10 @@ namespace util::cpp {
/// silently ignores configured directive by advancing the input cursor /// silently ignores configured directive by advancing the input cursor
/// past the provided line without writing to the output stream. /// past the provided line without writing to the output stream.
class ignore : public directive { class ignore : public directive {
util::tokeniser<const char*>::iterator cruft::tokeniser<const char*>::iterator
process (std::ostream&, process (std::ostream&,
context&, context&,
util::view<util::tokeniser<const char*>::iterator> lines) const override cruft::view<cruft::tokeniser<const char*>::iterator> lines) const override
{ return lines.begin ()++; } { return lines.begin ()++; }
}; };
@ -94,10 +94,10 @@ namespace util::cpp {
public: public:
passthrough (const std::string &name); passthrough (const std::string &name);
virtual util::tokeniser<const char*>::iterator virtual cruft::tokeniser<const char*>::iterator
process (std::ostream&, process (std::ostream&,
context&, context&,
util::view<util::tokeniser<const char*>::iterator>) const override; cruft::view<cruft::tokeniser<const char*>::iterator>) const override;
private: private:
const std::string m_name; const std::string m_name;
@ -113,10 +113,10 @@ namespace util::cpp {
void add (const std::experimental::filesystem::path&); void add (const std::experimental::filesystem::path&);
virtual util::tokeniser<const char*>::iterator virtual cruft::tokeniser<const char*>::iterator
process (std::ostream&, process (std::ostream&,
context&, context&,
util::view<util::tokeniser<const char*>::iterator>) const override; cruft::view<cruft::tokeniser<const char*>::iterator>) const override;
private: private:
processor &m_parent; processor &m_parent;

View File

@ -12,7 +12,7 @@
#include <iosfwd> #include <iosfwd>
namespace util::cpu { namespace cruft::cpu {
struct base { struct base {
struct { struct {
int logical; int logical;
@ -22,7 +22,7 @@ namespace util::cpu {
std::ostream& std::ostream&
operator<< (std::ostream&, const util::cpu::base&); operator<< (std::ostream&, const cruft::cpu::base&);
}; };
#endif #endif

View File

@ -16,7 +16,7 @@
#include <cstdint> #include <cstdint>
#include <ostream> #include <ostream>
using util::cpu::x86; using cruft::cpu::x86;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -89,15 +89,15 @@ x86::x86 ()
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
std::ostream& std::ostream&
util::cpu::operator<< (std::ostream &os, const x86 &val) cruft::cpu::operator<< (std::ostream &os, const x86 &val)
{ {
return os << util::format::printf ( return os << cruft::format::printf (
"{ name: { vendor: '%!', product: '%!' }" "{ name: { vendor: '%!', product: '%!' }"
", cores: { logical: %!, physical: %!, hyper_threading: %! }" ", cores: { logical: %!, physical: %!, hyper_threading: %! }"
", simd { sse: %!, sse2: %!, sse3: %!, ssse3: %!, sse41: %!, sse42: %! }" ", simd { sse: %!, sse2: %!, sse3: %!, ssse3: %!, sse41: %!, sse42: %! }"
" }", " }",
util::view {val.vendor_name}, cruft::view {val.vendor_name},
util::view {val.product_name}, cruft::view {val.product_name},
val.cores.logical, val.cores.logical,
val.cores.physical, val.cores.physical,
val.cores.hyper_threading, val.cores.hyper_threading,

View File

@ -13,7 +13,7 @@
#include <array> #include <array>
namespace util::cpu { namespace cruft::cpu {
struct x86 { struct x86 {
x86 (); x86 ();
@ -42,7 +42,7 @@ namespace util::cpu {
}; };
std::ostream& std::ostream&
operator<< (std::ostream&, const util::cpu::x86&); operator<< (std::ostream&, const cruft::cpu::x86&);
}; };
#endif #endif

View File

@ -14,12 +14,12 @@
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
using namespace util::debug; using namespace cruft::debug;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void void
util::debug::detail::panic (const char *msg) cruft::debug::detail::panic (const char *msg)
{ {
std::cerr << "PANIC: " << msg << "\n" << ::debug::backtrace () << std::endl; std::cerr << "PANIC: " << msg << "\n" << ::debug::backtrace () << std::endl;
breakpoint (); breakpoint ();
@ -29,7 +29,7 @@ util::debug::detail::panic (const char *msg)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void void
util::debug::detail::not_implemented (const char *msg) cruft::debug::detail::not_implemented (const char *msg)
{ {
panic (msg); panic (msg);
} }
@ -37,7 +37,7 @@ util::debug::detail::not_implemented (const char *msg)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
util::debug::detail::unreachable (const char *msg) cruft::debug::detail::unreachable (const char *msg)
{ {
panic (msg); panic (msg);
} }
@ -69,7 +69,7 @@ warn (const char *msg)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void void
util::debug::init [[gnu::constructor]] (void) cruft::debug::init [[gnu::constructor]] (void)
{ {
if (debug_enabled || getenv("DEBUG")) { if (debug_enabled || getenv("DEBUG")) {
LOG_INFO ("minimal debug setup"); LOG_INFO ("minimal debug setup");
@ -99,7 +99,7 @@ debug_wait [[gnu::constructor]] (void)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <> template <>
bool bool
util::debug::validator<float>::is_valid (const float &val) noexcept cruft::debug::validator<float>::is_valid (const float &val) noexcept
{ {
return !std::isnan (val); return !std::isnan (val);
} }
@ -108,7 +108,7 @@ util::debug::validator<float>::is_valid (const float &val) noexcept
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <> template <>
bool bool
util::debug::validator<double>::is_valid (const double &val) noexcept cruft::debug::validator<double>::is_valid (const double &val) noexcept
{ {
return !std::isnan (val); return !std::isnan (val);
} }
@ -121,12 +121,12 @@ util::debug::validator<double>::is_valid (const double &val) noexcept
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#define INSTANTIATE(KLASS) \ #define INSTANTIATE(KLASS) \
template <> \ template <> \
struct util::debug::validator<KLASS> { \ struct cruft::debug::validator<KLASS> { \
static bool is_valid(KLASS const&); \ static bool is_valid(KLASS const&); \
}; \ }; \
\ \
bool \ bool \
util::debug::validator<KLASS>::is_valid(KLASS const&) \ cruft::debug::validator<KLASS>::is_valid(KLASS const&) \
{ \ { \
return true; \ return true; \
} }

View File

@ -120,12 +120,12 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define SCOPED_SANITY(A) \ #define SCOPED_SANITY(A) \
::util::debug::scoped_sanity PASTE(__scoped_sanity_checker,__LINE__) ((A)); \ ::cruft::debug::scoped_sanity PASTE(__scoped_sanity_checker,__LINE__) ((A)); \
(void)PASTE(__scoped_sanity_checker,__LINE__); (void)PASTE(__scoped_sanity_checker,__LINE__);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define CHECK_SANITY(A,...) CHECK(::util::debug::is_valid ((A) __VA_OPT__(,) __VA_ARGS__)) #define CHECK_SANITY(A,...) CHECK(::cruft::debug::is_valid ((A) __VA_OPT__(,) __VA_ARGS__))
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -134,7 +134,7 @@
const auto &__a = (A); \ const auto &__a = (A); \
const auto &__b = (B); \ const auto &__b = (B); \
\ \
if (!::util::almost_equal (__a, __b)) { \ if (!::cruft::almost_equal (__a, __b)) { \
std::cerr << "expected equality\n" \ std::cerr << "expected equality\n" \
"__a: " #A " is " << __a << "\n" \ "__a: " #A " is " << __a << "\n" \
"__b: " #B " is " << __b << "\n"; \ "__b: " #B " is " << __b << "\n"; \
@ -231,7 +231,7 @@
const auto &__a = (A); \ const auto &__a = (A); \
const auto &__b = (B); \ const auto &__b = (B); \
\ \
if (::util::almost_equal (__a, __b)) { \ if (::cruft::almost_equal (__a, __b)) { \
std::cerr << "expected inequality\n" \ std::cerr << "expected inequality\n" \
"__a: " << #A << " is " << __a << "\n" \ "__a: " << #A << " is " << __a << "\n" \
"__b: " << #B << " is " << __b << "\n"; \ "__b: " << #B << " is " << __b << "\n"; \
@ -246,7 +246,7 @@
DEBUG_ONLY ( \ DEBUG_ONLY ( \
const auto &__a = (A); \ const auto &__a = (A); \
\ \
if (!::util::almost_zero (__a)) { \ if (!::cruft::almost_zero (__a)) { \
std::cerr << "expected zero\n" \ std::cerr << "expected zero\n" \
"__a: " << #A << " is " << __a << "\n"; \ "__a: " << #A << " is " << __a << "\n"; \
breakpoint (); \ breakpoint (); \
@ -260,7 +260,7 @@
DEBUG_ONLY ( \ DEBUG_ONLY ( \
const auto &__a = (A); \ const auto &__a = (A); \
\ \
if (::util::exactly_zero (__a)) { \ if (::cruft::exactly_zero (__a)) { \
std::cerr << "expected non-zero\n" \ std::cerr << "expected non-zero\n" \
"__a: " << #A << " is " << __a << '\n'; \ "__a: " << #A << " is " << __a << '\n'; \
breakpoint (); \ breakpoint (); \
@ -275,7 +275,7 @@
const auto &__check_mod_v = (V); \ const auto &__check_mod_v = (V); \
const auto &__check_mod_m = (M); \ const auto &__check_mod_m = (M); \
\ \
if (!::util::exactly_zero (__check_mod_v % __check_mod_m)) { \ if (!::cruft::exactly_zero (__check_mod_v % __check_mod_m)) { \
std::cerr << "expected zero modulus\n" \ std::cerr << "expected zero modulus\n" \
"__v: " << #V << " is " << __check_mod_v << "\n" \ "__v: " << #V << " is " << __check_mod_v << "\n" \
"__m: " << #M << " is " << __check_mod_m << "\n"; \ "__m: " << #M << " is " << __check_mod_m << "\n"; \
@ -360,7 +360,7 @@
/// useful for preventing optimisations eliding a variable. /// useful for preventing optimisations eliding a variable.
/// ///
/// stolen from Chandler Carruth's 2015 talk: "Tuning C++". /// stolen from Chandler Carruth's 2015 talk: "Tuning C++".
namespace util::debug { namespace cruft::debug {
template <class T> template <class T>
inline T* inline T*
escape (T *t) escape (T *t)
@ -409,7 +409,7 @@ namespace util::debug {
/// force the compiler to conceptually dirty the global memory space. /// force the compiler to conceptually dirty the global memory space.
/// ///
/// stolen from Chandler Carruth's 2015 talk: "Tuning C++". /// stolen from Chandler Carruth's 2015 talk: "Tuning C++".
namespace util::debug { namespace cruft::debug {
inline void inline void
clobber (void) clobber (void)
{ {
@ -422,7 +422,7 @@ void breakpoint (void);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::debug::detail { namespace cruft::debug::detail {
void void
panic [[noreturn]] (const char *msg); panic [[noreturn]] (const char *msg);
@ -440,7 +440,7 @@ panic [[noreturn]] (const char *msg)
{ {
! msg ! msg
? panic (msg) ? panic (msg)
: util::debug::detail::panic (msg); : cruft::debug::detail::panic (msg);
} }
@ -471,7 +471,7 @@ not_implemented [[noreturn]] (const char *msg)
{ {
! msg ! msg
? not_implemented (msg) ? not_implemented (msg)
: util::debug::detail::not_implemented (msg); : cruft::debug::detail::not_implemented (msg);
} }
@ -494,7 +494,7 @@ unreachable [[noreturn]] (const char *msg)
{ {
! msg ! msg
? unreachable (msg) ? unreachable (msg)
: util::debug::detail::unreachable (msg); : cruft::debug::detail::unreachable (msg);
} }
@ -508,7 +508,7 @@ unreachable [[noreturn]] (void)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
/// report a fatal error induced by an unhandled value, especially in switch /// report a fatal error induced by an unhandled value, especially in switch
/// statements. will almost invariably abort the application. /// statements. will almost invariably abort the application.
namespace util::debug::detail { namespace cruft::debug::detail {
template <typename T> template <typename T>
void void
unhandled [[noreturn]] (T &&t) noexcept unhandled [[noreturn]] (T &&t) noexcept
@ -524,7 +524,7 @@ template <typename T>
constexpr void constexpr void
unhandled [[noreturn]] (T &&t) noexcept unhandled [[noreturn]] (T &&t) noexcept
{ {
util::debug::detail::unhandled (std::forward<T> (t)); cruft::debug::detail::unhandled (std::forward<T> (t));
} }
@ -546,7 +546,7 @@ void disable_fpe (void);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::debug { namespace cruft::debug {
void init (void); void init (void);
@ -586,7 +586,7 @@ namespace util::debug {
struct validator<T*,ArgsT...> { struct validator<T*,ArgsT...> {
static bool is_valid (const T *val, ArgsT const &...args) noexcept static bool is_valid (const T *val, ArgsT const &...args) noexcept
{ {
return val && ::util::debug::is_valid (*val, args...); return val && ::cruft::debug::is_valid (*val, args...);
} }
}; };

View File

@ -65,12 +65,12 @@ class ViewPrinter(object):
) )
def build_cruft_dict(): def build_cruft_dict():
pretty_printers_dict[re.compile('^util::point.*$') ] = lambda title, val: CoordPrinter(title, val) pretty_printers_dict[re.compile('^cruft::point.*$') ] = lambda title, val: CoordPrinter(title, val)
pretty_printers_dict[re.compile('^util::vector.*$')] = lambda title, val: CoordPrinter(title, val) pretty_printers_dict[re.compile('^cruft::vector.*$')] = lambda title, val: CoordPrinter(title, val)
pretty_printers_dict[re.compile('^util::extent.*$')] = lambda title, val: CoordPrinter(title, val) pretty_printers_dict[re.compile('^cruft::extent.*$')] = lambda title, val: CoordPrinter(title, val)
pretty_printers_dict[re.compile('^util::colour.*$')] = lambda title, val: CoordPrinter(title, val) pretty_printers_dict[re.compile('^cruft::colour.*$')] = lambda title, val: CoordPrinter(title, val)
pretty_printers_dict[re.compile('^util::view')] = lambda title, val: ViewPrinter(title, val) pretty_printers_dict[re.compile('^cruft::view')] = lambda title, val: ViewPrinter(title, val)
def lookup(val): def lookup(val):

View File

@ -42,7 +42,7 @@ prepare_debugger (void)
{ {
if (nullptr == LoadLibrary("exchndl.dll")) { if (nullptr == LoadLibrary("exchndl.dll")) {
auto code = GetLastError (); auto code = GetLastError ();
LOG_WARNING("Emergency debugger not loaded: %s", util::win32::error::code_string (code)); LOG_WARNING("Emergency debugger not loaded: %s", cruft::win32::error::code_string (code));
} }
} }

View File

@ -17,7 +17,7 @@
#include <array> #include <array>
namespace util::encode { namespace cruft::encode {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
template <int Size> template <int Size>
struct alphabet { struct alphabet {
@ -137,7 +137,7 @@ namespace util::encode {
template <typename InputT, typename OutputT> template <typename InputT, typename OutputT>
static OutputT static OutputT
encode (OutputT dst, const util::view<InputT> src) encode (OutputT dst, const cruft::view<InputT> src)
{ {
// convert whole groups of symbols while we have enough bytes remaining // convert whole groups of symbols while we have enough bytes remaining
auto cursor = std::cbegin (src); auto cursor = std::cbegin (src);
@ -184,7 +184,7 @@ namespace util::encode {
//--------------------------------------------------------------------- //---------------------------------------------------------------------
template <typename InputT, typename OutputT> template <typename InputT, typename OutputT>
static OutputT static OutputT
decode (OutputT dst, util::view<InputT> src) decode (OutputT dst, cruft::view<InputT> src)
{ {
if (src.empty ()) if (src.empty ())
return dst; return dst;

View File

@ -15,7 +15,7 @@
#include <cstdint> #include <cstdint>
#include <type_traits> #include <type_traits>
namespace util { namespace cruft {
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
template <typename T> template <typename T>
constexpr T constexpr T

View File

@ -11,7 +11,7 @@
#include <experimental/filesystem> #include <experimental/filesystem>
namespace util { namespace cruft {
std::experimental::filesystem::path image_path (void); std::experimental::filesystem::path image_path (void);
} }

View File

@ -6,7 +6,7 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
std::experimental::filesystem::path std::experimental::filesystem::path
util::image_path (void) cruft::image_path (void)
{ {
int name[] = { int name[] = {
CTL_KERN, CTL_KERN,

View File

@ -19,7 +19,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
std::experimental::filesystem::path std::experimental::filesystem::path
util::image_path (void) cruft::image_path (void)
{ {
static const char PROC_SELF[] = "/proc/self/exe"; static const char PROC_SELF[] = "/proc/self/exe";
@ -33,7 +33,7 @@ retry:
if (written < 0) if (written < 0)
posix::error::throw_code (); posix::error::throw_code ();
if (util::cast::sign <size_t> (written) == resolved.size ()) { if (cruft::cast::sign <size_t> (written) == resolved.size ()) {
resolved.resize (resolved.size () * 2); resolved.resize (resolved.size () * 2);
goto retry; goto retry;
} }

View File

@ -18,7 +18,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
std::experimental::filesystem::path std::experimental::filesystem::path
util::image_path (void) cruft::image_path (void)
{ {
std::vector<char> resolved (256); std::vector<char> resolved (256);

View File

@ -14,7 +14,7 @@
#include <algorithm> #include <algorithm>
#include <numeric> #include <numeric>
using util::extent; using cruft::extent;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -35,7 +35,7 @@ extent<S,T>::extent (vector<S,T> _v)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
extent<S,T> extent<S,T>
extent<S,T>::expanded (util::vector<S,T> mag) const extent<S,T>::expanded (cruft::vector<S,T> mag) const
{ {
return *this + mag; return *this + mag;
} }
@ -46,7 +46,7 @@ template <size_t S, typename T>
extent<S,T> extent<S,T>
extent<S,T>::expanded (T t) const extent<S,T>::expanded (T t) const
{ {
return *this + util::vector<S,T> {t}; return *this + cruft::vector<S,T> {t};
} }
@ -78,7 +78,7 @@ extent<S,T>::empty (void) const
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::debug { namespace cruft::debug {
template <size_t S, typename T> template <size_t S, typename T>
struct validator<extent<S,T>> { struct validator<extent<S,T>> {
static bool is_valid (const extent<S,T> &e) static bool is_valid (const extent<S,T> &e)
@ -93,9 +93,9 @@ namespace util::debug {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#define INSTANTIATE_S_T(S,T) \ #define INSTANTIATE_S_T(S,T) \
template struct ::util::extent<S,T>; \ template struct ::cruft::extent<S,T>; \
template bool ::util::debug::is_valid (const ::util::extent<S,T>&); \ template bool ::cruft::debug::is_valid (const ::cruft::extent<S,T>&); \
template struct ::util::debug::validator<::util::extent<S,T>>; template struct ::cruft::debug::validator<::cruft::extent<S,T>>;
#define INSTANTIATE(T) \ #define INSTANTIATE(T) \
INSTANTIATE_S_T(1,T) \ INSTANTIATE_S_T(1,T) \

View File

@ -17,17 +17,17 @@
#include <cstddef> #include <cstddef>
namespace util { namespace cruft {
/** /**
* A pure n-dimensional size, without positioning * A pure n-dimensional size, without positioning
*/ */
template <size_t S, typename T> template <size_t S, typename T>
struct extent : public ::util::coord::base<S,T,::util::extent<S,T>> struct extent : public ::cruft::coord::base<S,T,::cruft::extent<S,T>>
{ {
using ::util::coord::base<S,T,::util::extent<S,T>>::base; using ::cruft::coord::base<S,T,::cruft::extent<S,T>>::base;
extent () = default; extent () = default;
explicit extent (::util::vector<S,T>); explicit extent (::cruft::vector<S,T>);
constexpr T constexpr T
area (void) const area (void) const
@ -61,9 +61,9 @@ namespace util {
/// tests whether a point would lie within: /// tests whether a point would lie within:
/// region { origin, *this }, inclusive of borders. /// region { origin, *this }, inclusive of borders.
/// ///
/// included for parity with util::region. /// included for parity with cruft::region.
constexpr bool constexpr bool
inclusive (util::point<S,T> p) const inclusive (cruft::point<S,T> p) const
{ {
return all (p >= T{0} && p <= *this); return all (p >= T{0} && p <= *this);
} }
@ -71,22 +71,22 @@ namespace util {
/// tests whether a point would like within: /// tests whether a point would like within:
/// region { origin, *this }, exclusive of the bottom-right border /// region { origin, *this }, exclusive of the bottom-right border
/// included for parity with util::region /// included for parity with cruft::region
constexpr bool constexpr bool
exclusive (point<S,T> p) const exclusive (point<S,T> p) const
{ {
return all (p >= T{0} && p < *this); return all (p >= T{0} && p < *this);
} }
::util::extent<S,T> expanded (::util::vector<S,T>) const; ::cruft::extent<S,T> expanded (::cruft::vector<S,T>) const;
::util::extent<S,T> expanded (T) const; ::cruft::extent<S,T> expanded (T) const;
::util::extent<S,T> contracted (::util::vector<S,T>) const; ::cruft::extent<S,T> contracted (::cruft::vector<S,T>) const;
::util::extent<S,T> contracted (T) const; ::cruft::extent<S,T> contracted (T) const;
bool empty (void) const; bool empty (void) const;
static constexpr static constexpr
::util::extent<S,T> max (void) ::cruft::extent<S,T> max (void)
{ {
return extent<S,T> { return extent<S,T> {
std::numeric_limits<T>::max () std::numeric_limits<T>::max ()
@ -95,7 +95,7 @@ namespace util {
static constexpr static constexpr
::util::extent<S,T> min (void) ::cruft::extent<S,T> min (void)
{ {
return extent<S,T> { 0 }; return extent<S,T> { 0 };
} }
@ -150,7 +150,7 @@ namespace util {
point<S,T> last {0}; point<S,T> last {0};
last[S-1] = this->data[S-1]; last[S-1] = this->data[S-1];
return util::view { return cruft::view {
iterator {point<S,T> {0}, *this}, iterator {point<S,T> {0}, *this},
iterator {last, *this} iterator {last, *this}
}; };
@ -159,20 +159,20 @@ namespace util {
template <size_t S, typename T> template <size_t S, typename T>
util::point<S,T> cruft::point<S,T>
sample (util::extent<S,T> shape) sample (cruft::extent<S,T> shape)
{ {
return sample (shape, util::random::generator ()); return sample (shape, cruft::random::generator ());
} }
template <size_t S, typename T, typename GeneratorT> template <size_t S, typename T, typename GeneratorT>
util::point<S,T> cruft::point<S,T>
sample (util::extent<S,T> shape, GeneratorT &&gen) sample (cruft::extent<S,T> shape, GeneratorT &&gen)
{ {
util::point<S,T> p; cruft::point<S,T> p;
for (size_t i = 0; i < S; ++i) for (size_t i = 0; i < S; ++i)
p[i] = util::random::uniform (0, shape[i], gen); p[i] = cruft::random::uniform (0, shape[i], gen);
return p; return p;
} }

View File

@ -12,7 +12,7 @@
#include <ostream> #include <ostream>
using namespace util; using namespace cruft;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -89,8 +89,8 @@ fixed<T,I,E>::to_integer (native_type n)
// Fixed operators // Fixed operators
#define SIMPLE_FIXED_REF(OP) \ #define SIMPLE_FIXED_REF(OP) \
template <typename T, unsigned I, unsigned E> \ template <typename T, unsigned I, unsigned E> \
util::fixed<T,I,E>& \ cruft::fixed<T,I,E>& \
util::fixed<T,I,E>::operator OP (const fixed<T,I,E> rhs) \ cruft::fixed<T,I,E>::operator OP (const fixed<T,I,E> rhs) \
{ \ { \
m_value OP rhs.m_value; \ m_value OP rhs.m_value; \
return *this; \ return *this; \
@ -102,8 +102,8 @@ SIMPLE_FIXED_REF(+=)
#define SIMPLE_FIXED_LIT(OP) \ #define SIMPLE_FIXED_LIT(OP) \
template <typename T, unsigned I, unsigned E> \ template <typename T, unsigned I, unsigned E> \
util::fixed<T,I,E> \ cruft::fixed<T,I,E> \
util::fixed<T,I,E>::operator OP (const fixed<T,I,E> rhs) const \ cruft::fixed<T,I,E>::operator OP (const fixed<T,I,E> rhs) const \
{ \ { \
fixed<T,I,E> v; \ fixed<T,I,E> v; \
v.m_value = m_value OP rhs.m_value; \ v.m_value = m_value OP rhs.m_value; \
@ -152,18 +152,18 @@ SIMPLE_INTEGER_LIT(/)
#define LOGIC_OP(OP) \ #define LOGIC_OP(OP) \
template <typename T, unsigned I, unsigned E> \ template <typename T, unsigned I, unsigned E> \
bool \ bool \
util::operator OP (util::fixed<T,I,E> a, \ cruft::operator OP (cruft::fixed<T,I,E> a, \
util::fixed<T,I,E> b) \ cruft::fixed<T,I,E> b) \
{ \ { \
return a.to_native () OP b.to_native (); \ return a.to_native () OP b.to_native (); \
} \ } \
\ \
template <typename T, unsigned I, unsigned E> \ template <typename T, unsigned I, unsigned E> \
bool \ bool \
util::operator OP (util::fixed<T,I,E> a, \ cruft::operator OP (cruft::fixed<T,I,E> a, \
typename util::fixed<T,I,E>::integer_type b) \ typename cruft::fixed<T,I,E>::integer_type b) \
{ \ { \
return a OP util::fixed<T,I,E>::from_integer (b); \ return a OP cruft::fixed<T,I,E>::from_integer (b); \
} }
LOGIC_OP(==) LOGIC_OP(==)
@ -178,7 +178,7 @@ LOGIC_OP(>=)
// iostream operators // iostream operators
template <typename T, unsigned I, unsigned E> template <typename T, unsigned I, unsigned E>
std::ostream& std::ostream&
util::operator<< (std::ostream &os, fixed<T,I,E> v) cruft::operator<< (std::ostream &os, fixed<T,I,E> v)
{ {
return os << v.to_double (); return os << v.to_double ();
} }
@ -188,22 +188,22 @@ util::operator<< (std::ostream &os, fixed<T,I,E> v)
// Instantiations // Instantiations
#define INSTANTIATE(T,I,E) \ #define INSTANTIATE(T,I,E) \
template class util::fixed<T,I,E>; \ template class cruft::fixed<T,I,E>; \
template std::ostream& util::operator<< (std::ostream&, fixed<T,I,E>); \ template std::ostream& cruft::operator<< (std::ostream&, fixed<T,I,E>); \
template bool util::operator== (util::fixed<T,I,E>, util::fixed<T,I,E>); \ template bool cruft::operator== (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>); \
template bool util::operator!= (util::fixed<T,I,E>, util::fixed<T,I,E>); \ template bool cruft::operator!= (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>); \
template bool util::operator< (util::fixed<T,I,E>, util::fixed<T,I,E>); \ template bool cruft::operator< (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>); \
template bool util::operator<= (util::fixed<T,I,E>, util::fixed<T,I,E>); \ template bool cruft::operator<= (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>); \
template bool util::operator> (util::fixed<T,I,E>, util::fixed<T,I,E>); \ template bool cruft::operator> (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>); \
template bool util::operator>= (util::fixed<T,I,E>, util::fixed<T,I,E>); \ template bool cruft::operator>= (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>); \
template bool util::operator== (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); \ template bool cruft::operator== (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type); \
template bool util::operator!= (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); \ template bool cruft::operator!= (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type); \
template bool util::operator< (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); \ template bool cruft::operator< (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type); \
template bool util::operator<= (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); \ template bool cruft::operator<= (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type); \
template bool util::operator> (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); \ template bool cruft::operator> (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type); \
template bool util::operator>= (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template bool cruft::operator>= (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template class util::fixed<signed,8,8>; template class cruft::fixed<signed,8,8>;
INSTANTIATE(signed, 2,14) INSTANTIATE(signed, 2,14)
INSTANTIATE(signed,16,16) INSTANTIATE(signed,16,16)

View File

@ -15,7 +15,7 @@
#include <iosfwd> #include <iosfwd>
namespace util { namespace cruft {
template < template <
// whether the type is signed or unsigned. supply an appropriately // whether the type is signed or unsigned. supply an appropriately
// signed type here; it won't be used for anything else. // signed type here; it won't be used for anything else.
@ -96,19 +96,19 @@ namespace util {
} }
template <typename T, unsigned I, unsigned E> bool operator== (util::fixed<T,I,E>, util::fixed<T,I,E>); template <typename T, unsigned I, unsigned E> bool operator== (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>);
template <typename T, unsigned I, unsigned E> bool operator!= (util::fixed<T,I,E>, util::fixed<T,I,E>); template <typename T, unsigned I, unsigned E> bool operator!= (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>);
template <typename T, unsigned I, unsigned E> bool operator< (util::fixed<T,I,E>, util::fixed<T,I,E>); template <typename T, unsigned I, unsigned E> bool operator< (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>);
template <typename T, unsigned I, unsigned E> bool operator<= (util::fixed<T,I,E>, util::fixed<T,I,E>); template <typename T, unsigned I, unsigned E> bool operator<= (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>);
template <typename T, unsigned I, unsigned E> bool operator> (util::fixed<T,I,E>, util::fixed<T,I,E>); template <typename T, unsigned I, unsigned E> bool operator> (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>);
template <typename T, unsigned I, unsigned E> bool operator>= (util::fixed<T,I,E>, util::fixed<T,I,E>); template <typename T, unsigned I, unsigned E> bool operator>= (cruft::fixed<T,I,E>, cruft::fixed<T,I,E>);
template <typename T, unsigned I, unsigned E> bool operator== (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template <typename T, unsigned I, unsigned E> bool operator== (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template <typename T, unsigned I, unsigned E> bool operator!= (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template <typename T, unsigned I, unsigned E> bool operator!= (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template <typename T, unsigned I, unsigned E> bool operator< (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template <typename T, unsigned I, unsigned E> bool operator< (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template <typename T, unsigned I, unsigned E> bool operator<= (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template <typename T, unsigned I, unsigned E> bool operator<= (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template <typename T, unsigned I, unsigned E> bool operator> (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template <typename T, unsigned I, unsigned E> bool operator> (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template <typename T, unsigned I, unsigned E> bool operator>= (util::fixed<T,I,E>, typename util::fixed<T,I,E>::integer_type); template <typename T, unsigned I, unsigned E> bool operator>= (cruft::fixed<T,I,E>, typename cruft::fixed<T,I,E>::integer_type);
template <typename T, unsigned I, unsigned E> template <typename T, unsigned I, unsigned E>
std::ostream& operator<< (std::ostream&, fixed<T,I,E>); std::ostream& operator<< (std::ostream&, fixed<T,I,E>);

View File

@ -107,7 +107,7 @@ ns::is_directory (const path &p)
struct stat buf; struct stat buf;
if (stat (p.c_str (), &buf)) if (stat (p.c_str (), &buf))
::util::errno_error::throw_code (); ::cruft::errno_error::throw_code ();
return S_ISDIR (buf.st_mode); return S_ISDIR (buf.st_mode);
} }

View File

@ -11,7 +11,7 @@
#include <cmath> #include <cmath>
using util::ieee_float; using cruft::ieee_float;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -149,6 +149,6 @@ ieee_float<E, S>::almost_equal (floating_t _a,
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template class util::ieee_float< 5, 10>; // ieee_half template class cruft::ieee_float< 5, 10>; // ieee_half
template class util::ieee_float< 8, 23>; // ieee_single; template class cruft::ieee_float< 8, 23>; // ieee_single;
template class util::ieee_float<11, 52>; // ieee_double; template class cruft::ieee_float<11, 52>; // ieee_double;

View File

@ -13,7 +13,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util { namespace cruft {
template <unsigned int EXPONENT, unsigned int SIGNIFICAND> template <unsigned int EXPONENT, unsigned int SIGNIFICAND>
class ieee_float class ieee_float
{ {

View File

@ -14,7 +14,7 @@
// disable some noisy warnings (doubly so given -Werror) // disable some noisy warnings (doubly so given -Werror)
#pragma GCC diagnostic ignored "-Wold-style-cast" #pragma GCC diagnostic ignored "-Wold-style-cast"
namespace util::format { namespace cruft::format {
std::ostream& std::ostream&
operator<< (std::ostream &os, type_t val) operator<< (std::ostream &os, type_t val)
{ {
@ -138,8 +138,8 @@ namespace util::format {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
util::format::parsed cruft::format::parsed
util::format::printf (util::view<const char*> fmt) cruft::format::printf (cruft::view<const char*> fmt)
{ {
std::vector<specifier> specs; std::vector<specifier> specs;
specifier s; specifier s;
@ -167,8 +167,8 @@ util::format::printf (util::view<const char*> fmt)
/// ///
/// in the event of a parsing error the function will throw. makes no /// in the event of a parsing error the function will throw. makes no
/// attempt to cater for constexpr validation. /// attempt to cater for constexpr validation.
util::format::parsed cruft::format::parsed
util::format::python (util::view<const char*> fmt) cruft::format::python (cruft::view<const char*> fmt)
{ {
std::vector<specifier> specs; std::vector<specifier> specs;

View File

@ -19,7 +19,7 @@
#include <sstream> #include <sstream>
#include <vector> #include <vector>
namespace util::format { namespace cruft::format {
/// denotes the stated data type of one specifier /// denotes the stated data type of one specifier
enum class type_t { enum class type_t {
/// an internal type that indicates a span of literal text to copy /// an internal type that indicates a span of literal text to copy
@ -37,7 +37,7 @@ namespace util::format {
REAL, REAL,
/// a C style string, or equivalent C++ type (std::string, /// a C style string, or equivalent C++ type (std::string,
/// std::string_view, util::view, etc, ...) /// std::string_view, cruft::view, etc, ...)
STRING, STRING,
/// a single character /// a single character
CHAR, CHAR,
@ -56,7 +56,7 @@ namespace util::format {
/// the sub-region of the format specifier that we parsed for this /// the sub-region of the format specifier that we parsed for this
/// information. probably only useful for the LITERAL type as we just /// information. probably only useful for the LITERAL type as we just
/// copy the view into the output buffer directly. /// copy the view into the output buffer directly.
util::view<const char*> fmt = util::view<const char*> {nullptr}; view<const char*> fmt = view<const char*> {nullptr};
int parameter = -1; int parameter = -1;
@ -125,7 +125,7 @@ namespace util::format {
{ ; } { ; }
auto specifiers (void) const auto specifiers (void) const
{ return util::make_view (m_parsed.m_specifiers); } { return view (m_parsed.m_specifiers); }
template <size_t Index> template <size_t Index>
auto auto
@ -149,7 +149,7 @@ namespace util::format {
auto auto
specifiers (void) const& specifiers (void) const&
{ {
return util::view {m_specifiers}; return view {m_specifiers};
} }
template <size_t Index> template <size_t Index>
@ -181,7 +181,7 @@ namespace util::format {
/// if the format specifier is invalid the function will throw an error at /// if the format specifier is invalid the function will throw an error at
/// runtime. specifically does not make allowances for constexpr /// runtime. specifically does not make allowances for constexpr
/// validation. /// validation.
parsed printf (util::view<const char*>); parsed printf (view<const char*>);
/// parses a format specifier in the style of PEP3101 (with the notable /// parses a format specifier in the style of PEP3101 (with the notable
@ -189,13 +189,13 @@ namespace util::format {
/// ///
/// in the event of a parsing error the function will throw. makes no /// in the event of a parsing error the function will throw. makes no
/// attempt to cater for constexpr validation. /// attempt to cater for constexpr validation.
parsed python (util::view<const char*>); parsed python (view<const char*>);
/// parses a printf format string and binds parameters for rendering. /// parses a printf format string and binds parameters for rendering.
template <typename ...Args> template <typename ...Args>
auto auto
printf (util::view<const char*> fmt, Args &&...args) printf (view<const char*> fmt, Args &&...args)
{ {
return printf (fmt) (args...); return printf (fmt) (args...);
} }
@ -204,7 +204,7 @@ namespace util::format {
/// parses a python format string and binds parameters for rendering. /// parses a python format string and binds parameters for rendering.
template <typename ...Args> template <typename ...Args>
auto auto
python (util::view<const char*> fmt, Args &&...args) python (view<const char*> fmt, Args &&...args)
{ {
return python (fmt) (args...); return python (fmt) (args...);
} }
@ -234,7 +234,7 @@ namespace util::format {
break; break;
case type_t::STRING: case type_t::STRING:
if (!std::is_same_v<ValueT, util::view<const char*>> && !std::is_same_v<ValueT, std::string>) if (!std::is_same_v<ValueT, view<const char*>> && !std::is_same_v<ValueT, std::string>)
throw std::runtime_error ("expected string value"); throw std::runtime_error ("expected string value");
break; break;
@ -348,11 +348,11 @@ namespace util::format {
} }
} }
if constexpr (std::is_same_v<util::view<const char*>, ValueT>) { if constexpr (std::is_same_v<view<const char*>, ValueT>) {
if (spec.precision >= 0) { if (spec.precision >= 0) {
std::copy_n ( std::copy_n (
std::begin (val), std::begin (val),
util::min (spec.precision, static_cast<int> (val.size ())), min (spec.precision, static_cast<int> (val.size ())),
std::ostream_iterator<char> (os) std::ostream_iterator<char> (os)
); );
return os; return os;
@ -416,7 +416,7 @@ namespace util::format {
static std::ostream& static std::ostream&
write (std::ostream &os, specifier spec, const char (&val)[N]) { write (std::ostream &os, specifier spec, const char (&val)[N]) {
if (spec.type == type_t::STRING || spec.type == type_t::USER) if (spec.type == type_t::STRING || spec.type == type_t::USER)
return value<util::view<const char*>>::write (os, spec, util::view<const char*> (val)); return value<view<const char*>>::write (os, spec, view<const char*> (val));
throw std::runtime_error ("invalid data type"); throw std::runtime_error ("invalid data type");
} }
}; };
@ -426,7 +426,7 @@ namespace util::format {
struct value<char[N]> { struct value<char[N]> {
static std::ostream& static std::ostream&
write (std::ostream &os, specifier spec, const char (&val)[N]) { write (std::ostream &os, specifier spec, const char (&val)[N]) {
return value<util::view<const char*>>::write (os, spec, util::view<const char*> (val)); return value<view<const char*>>::write (os, spec, view<const char*> (val));
} }
}; };
@ -438,7 +438,7 @@ namespace util::format {
if (!val) if (!val)
return os << "(nil)"; return os << "(nil)";
if (spec.type == type_t::STRING || spec.type == type_t::USER) if (spec.type == type_t::STRING || spec.type == type_t::USER)
return value<util::view<const char*>>::write (os, spec, util::view<const char*> { val, val + strlen (val) }); return value<view<const char*>>::write (os, spec, view<const char*> { val, val + strlen (val) });
if (spec.type == type_t::POINTER) if (spec.type == type_t::POINTER)
return value<const void*>::write (os, spec, val); return value<const void*>::write (os, spec, val);
throw std::runtime_error ("invalid data type"); throw std::runtime_error ("invalid data type");
@ -453,7 +453,7 @@ namespace util::format {
if (!val) if (!val)
return os << "(nil)"; return os << "(nil)";
if (spec.type == type_t::STRING || spec.type == type_t::USER) if (spec.type == type_t::STRING || spec.type == type_t::USER)
return value<util::view<const char*>>::write (os, spec, util::view<const char*> { val, val + strlen (val) }); return value<view<const char*>>::write (os, spec, view<const char*> { val, val + strlen (val) });
if (spec.type == type_t::POINTER) if (spec.type == type_t::POINTER)
return value<const void*>::write (os, spec, val); return value<const void*>::write (os, spec, val);
throw std::runtime_error ("invalid data type"); throw std::runtime_error ("invalid data type");
@ -465,8 +465,8 @@ namespace util::format {
struct value<const std::string&> { struct value<const std::string&> {
static std::ostream& static std::ostream&
write (std::ostream &os, specifier spec, const std::string &val) { write (std::ostream &os, specifier spec, const std::string &val) {
return value<util::view<const char*>>::write ( return value<view<const char*>>::write (
os, spec, util::view<const char*> (val.data (), val.data () + val.size ()) os, spec, view<const char*> (val.data (), val.data () + val.size ())
); );
} }
}; };
@ -511,7 +511,7 @@ namespace util::format {
if constexpr (Index < sizeof... (DataT)) { if constexpr (Index < sizeof... (DataT)) {
using value_t = std::tuple_element_t<Index,std::tuple<DataT...>>; using value_t = std::tuple_element_t<Index,std::tuple<DataT...>>;
value<value_t>::write (os, s, data.template get<Index> ()); value<value_t>::write (os, s, data.template get<Index> ());
return write<Index+1> (os, util::make_view (cursor+1,specifiers.end ()), data); return write<Index+1> (os, make_view (cursor+1,specifiers.end ()), data);
} else { } else {
throw std::runtime_error ("insufficient data parameters"); throw std::runtime_error ("insufficient data parameters");
} }

View File

@ -10,7 +10,7 @@
#include <ostream> #include <ostream>
using util::fourcc; using cruft::fourcc;
static_assert (sizeof(fourcc) == 4, "fourcc must be a 4 byte POD"); static_assert (sizeof(fourcc) == 4, "fourcc must be a 4 byte POD");
@ -64,7 +64,7 @@ fourcc::operator uint32_t (void) const {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
std::ostream& std::ostream&
util::operator<< (std::ostream &os, fourcc f) { cruft::operator<< (std::ostream &os, fourcc f) {
os << f.data[0] << f.data[1] << f.data[2] << f.data[3]; os << f.data[0] << f.data[1] << f.data[2] << f.data[3];
return os; return os;
} }

View File

@ -12,7 +12,7 @@
#include <iosfwd> #include <iosfwd>
#include <cstdint> #include <cstdint>
namespace util { namespace cruft {
struct fourcc { struct fourcc {
uint8_t data[4]; uint8_t data[4];
@ -23,7 +23,7 @@ namespace util {
operator uint32_t (void) const; operator uint32_t (void) const;
}; };
std::ostream& operator<< (std::ostream&, util::fourcc); std::ostream& operator<< (std::ostream&, cruft::fourcc);
} }

View File

@ -11,7 +11,7 @@
#include <utility> #include <utility>
namespace util::functor { namespace cruft::functor {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/// returns the value provided at construction time regardless of the /// returns the value provided at construction time regardless of the
/// arguments supplied in the call operator. /// arguments supplied in the call operator.

View File

@ -13,13 +13,13 @@
#include "../coord/iostream.hpp" #include "../coord/iostream.hpp"
#include "../debug.hpp" #include "../debug.hpp"
using util::geom::aabb; using cruft::geom::aabb;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <> template <>
std::array< std::array<
util::point3f,8 cruft::point3f,8
> >
aabb<3,float>::vertices (void) const noexcept aabb<3,float>::vertices (void) const noexcept
{ {
@ -37,7 +37,7 @@ aabb<3,float>::vertices (void) const noexcept
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::debug { namespace cruft::debug {
template <size_t S, typename T> template <size_t S, typename T>
struct validator<aabb<S,T>> { struct validator<aabb<S,T>> {
static bool is_valid (const aabb<S,T> &b) static bool is_valid (const aabb<S,T> &b)
@ -51,7 +51,7 @@ namespace util::debug {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
util::geom::operator<< (std::ostream &os, util::geom::aabb<S,T> b) cruft::geom::operator<< (std::ostream &os, cruft::geom::aabb<S,T> b)
{ {
return os << "[ " << b.lo << ", " << b.hi << " ]"; return os << "[ " << b.lo << ", " << b.hi << " ]";
} }
@ -59,9 +59,9 @@ util::geom::operator<< (std::ostream &os, util::geom::aabb<S,T> b)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#define INSTANTIATE_S_T(S,T) \ #define INSTANTIATE_S_T(S,T) \
namespace util::geom { template struct aabb<S,T>; } \ namespace cruft::geom { template struct aabb<S,T>; } \
template bool util::debug::is_valid (const aabb<S,T>&); \ template bool cruft::debug::is_valid (const aabb<S,T>&); \
template std::ostream& util::geom::operator<< (std::ostream&, aabb<S,T>); template std::ostream& cruft::geom::operator<< (std::ostream&, aabb<S,T>);
#define INSTANTIATE(T) \ #define INSTANTIATE(T) \
INSTANTIATE_S_T(2,T) \ INSTANTIATE_S_T(2,T) \

View File

@ -16,7 +16,7 @@
#include <cstdint> #include <cstdint>
namespace util::geom { namespace cruft::geom {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/// represents an axis-aligned bounding-box through two opposing corners. /// represents an axis-aligned bounding-box through two opposing corners.
/// ///
@ -37,7 +37,7 @@ namespace util::geom {
extent<S,T> extent<S,T>
magnitude (void) const magnitude (void) const
{ {
return (hi - lo).template as<util::extent> (); return (hi - lo).template as<cruft::extent> ();
} }
@ -90,8 +90,8 @@ namespace util::geom {
auto operator| [[nodiscard]] (point<S,T> p) const noexcept auto operator| [[nodiscard]] (point<S,T> p) const noexcept
{ {
return aabb ( return aabb (
util::min (lo, p), cruft::min (lo, p),
util::max (hi, p) cruft::max (hi, p)
); );
} }
@ -109,12 +109,12 @@ namespace util::geom {
}; };
} }
std::array<util::point<S,T>,util::pow(2,S)> std::array<cruft::point<S,T>,cruft::pow(2,S)>
vertices (void) const noexcept; vertices (void) const noexcept;
::util::point<S,T> lo; ::cruft::point<S,T> lo;
::util::point<S,T> hi; ::cruft::point<S,T> hi;
}; };
@ -143,7 +143,7 @@ namespace util::geom {
#include <random> #include <random>
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T, typename G> template <size_t S, typename T, typename G>
struct sampler<S,T,aabb,G> { struct sampler<S,T,aabb,G> {
static point<S,T> static point<S,T>
@ -154,7 +154,7 @@ namespace util::geom {
point<S,T> p; point<S,T> p;
std::generate (p.begin (), p.end (), [&] (void) { return d (g); }); std::generate (p.begin (), p.end (), [&] (void) { return d (g); });
return p * (b.hi - b.lo) + b.lo.template as<util::vector> (); return p * (b.hi - b.lo) + b.lo.template as<cruft::vector> ();
} }
}; };
} }

View File

@ -8,13 +8,13 @@
#include "cylinder.hpp" #include "cylinder.hpp"
using util::geom::cylinder; using cruft::geom::cylinder;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
bool bool
cylinder<S,T>::includes (util::point<S,T> p_) const cylinder<S,T>::includes (cruft::point<S,T> p_) const
{ {
auto p10 = p1 - p0; auto p10 = p1 - p0;
auto p_0 = p_ - p0; auto p_0 = p_ - p0;
@ -32,5 +32,5 @@ cylinder<S,T>::includes (util::point<S,T> p_) const
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template struct util::geom::cylinder<2,float>; template struct cruft::geom::cylinder<2,float>;
template struct util::geom::cylinder<3,float>; template struct cruft::geom::cylinder<3,float>;

View File

@ -12,14 +12,14 @@
#include "../point.hpp" #include "../point.hpp"
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T> template <size_t S, typename T>
struct cylinder { struct cylinder {
util::point<S,T> p0, p1; cruft::point<S,T> p0, p1;
T radius; T radius;
float distance (util::point<S,T>) const; float distance (cruft::point<S,T>) const;
bool includes (util::point<S,T>) const; bool includes (cruft::point<S,T>) const;
}; };
using cylinder3f = cylinder<3,float>; using cylinder3f = cylinder<3,float>;

View File

@ -18,16 +18,16 @@
#include "../matrix.hpp" #include "../matrix.hpp"
#include "../coord/iostream.hpp" #include "../coord/iostream.hpp"
using util::geom::ellipse; using cruft::geom::ellipse;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <> template <>
bool bool
util::geom::intersects (ellipse3f e, util::point3f p) cruft::geom::intersects (ellipse3f e, cruft::point3f p)
{ {
auto transform = util::quaternionf::from_to (e.up, {0,1,0}).as_matrix () * auto transform = cruft::quaternionf::from_to (e.up, {0,1,0}).as_matrix () *
util::translation (0-e.origin); cruft::translation (0-e.origin);
return all (abs (transform * p) <= e.radius); return all (abs (transform * p) <= e.radius);
@ -41,13 +41,13 @@ util::geom::intersects (ellipse3f e, util::point3f p)
// a sphere // a sphere
template <> template <>
float float
util::geom::distance (ray3f r, ellipse3f e) cruft::geom::distance (ray3f r, ellipse3f e)
{ {
// find a transform that puts the ellipse at origin and scales it to a // find a transform that puts the ellipse at origin and scales it to a
// unit sphere. // unit sphere.
auto const from_scaled = util::translation (e.origin.template as<vector> ()) * auto const from_scaled = cruft::translation (e.origin.template as<vector> ()) *
util::quaternionf::from_to ({0,1,0}, e.up) * cruft::quaternionf::from_to ({0,1,0}, e.up) *
util::scale (e.radius); cruft::scale (e.radius);
auto const to_scaled = inverse (from_scaled); auto const to_scaled = inverse (from_scaled);
// transform the ray into this new space and query against a unit sphere // transform the ray into this new space and query against a unit sphere
@ -62,17 +62,17 @@ util::geom::distance (ray3f r, ellipse3f e)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <> template <>
util::point3f cruft::point3f
util::geom::project (util::geom::ray3f lhs, cruft::geom::project (cruft::geom::ray3f lhs,
util::geom::ellipse3f rhs) cruft::geom::ellipse3f rhs)
{ {
return lhs.origin + lhs.direction * distance (lhs, rhs); return lhs.origin + lhs.direction * distance (lhs, rhs);
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
util::geom::ellipse3f cruft::geom::ellipse3f
util::geom::cover (util::view<const point3f*> src) cruft::geom::cover (cruft::view<const point3f*> src)
{ {
// find our major axis points and vector // find our major axis points and vector
const auto [a,b] = furthest (src); const auto [a,b] = furthest (src);
@ -81,11 +81,11 @@ util::geom::cover (util::view<const point3f*> src)
auto const dir = normalised (diff); auto const dir = normalised (diff);
// find a transform such that we recentre about the origin // find a transform such that we recentre about the origin
auto const transform = quaternionf::from_to (dir, util::vector3f{1,0,0}).as_matrix () * auto const transform = quaternionf::from_to (dir, cruft::vector3f{1,0,0}).as_matrix () *
translation (0 -a -diff*0.5f); translation (0 -a -diff*0.5f);
// find the maximum absolute value in each axis // find the maximum absolute value in each axis
util::point3f hi {0}; cruft::point3f hi {0};
for (auto const& p: src) for (auto const& p: src)
hi = max (abs (transform * p), hi); hi = max (abs (transform * p), hi);
@ -93,14 +93,14 @@ util::geom::cover (util::view<const point3f*> src)
return ellipse3f { return ellipse3f {
.origin = a + diff * 0.5f, .origin = a + diff * 0.5f,
.radius = hi.as<vector> (), .radius = hi.as<vector> (),
.up = rotate ({0,1,0}, util::quaternionf::from_to ({1,0,0}, dir)) .up = rotate ({0,1,0}, cruft::quaternionf::from_to ({1,0,0}, dir))
}; };
}; };
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
static util::geom::aabb<S,T> static cruft::geom::aabb<S,T>
bounds (ellipse<S,T> e) bounds (ellipse<S,T> e)
{ {
return { return {
@ -112,8 +112,8 @@ bounds (ellipse<S,T> e)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t S, typename T, template <size_t,typename> class K> template <size_t S, typename T, template <size_t,typename> class K>
util::geom::aabb<S,T> cruft::geom::aabb<S,T>
util::geom::bounds (K<S,T> k) cruft::geom::bounds (K<S,T> k)
{ {
return ::bounds (k); return ::bounds (k);
} }
@ -122,7 +122,7 @@ util::geom::bounds (K<S,T> k)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
util::geom::operator<< (std::ostream &os, ellipse<S,T> val) cruft::geom::operator<< (std::ostream &os, ellipse<S,T> val)
{ {
return os << "{ origin: " << val.origin return os << "{ origin: " << val.origin
<< ", radius: " << val.radius << ", radius: " << val.radius
@ -133,11 +133,11 @@ util::geom::operator<< (std::ostream &os, ellipse<S,T> val)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define INSTANTIATE_S_T(S,T) \ #define INSTANTIATE_S_T(S,T) \
template util::geom::aabb<S,T> util::geom::bounds (ellipse<S,T>); \ template cruft::geom::aabb<S,T> cruft::geom::bounds (ellipse<S,T>); \
template std::ostream& util::geom::operator<< (std::ostream&, ellipse<S,T>); template std::ostream& cruft::geom::operator<< (std::ostream&, ellipse<S,T>);
//template util::point<S,T> util::geom::project(ray<S,T>, ellipse<S,T>); //template cruft::point<S,T> cruft::geom::project(ray<S,T>, ellipse<S,T>);
//template bool util::geom::intersects (ellipse<S,T>, util::point<S,T>); //template bool cruft::geom::intersects (ellipse<S,T>, cruft::point<S,T>);
INSTANTIATE_S_T(2,float) INSTANTIATE_S_T(2,float)
INSTANTIATE_S_T(3,float) INSTANTIATE_S_T(3,float)

View File

@ -20,18 +20,18 @@
#include <iosfwd> #include <iosfwd>
namespace util::geom { namespace cruft::geom {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
template <size_t S, typename ValueT> template <size_t S, typename ValueT>
struct ellipse { struct ellipse {
// the centre point of the ellipsoid // the centre point of the ellipsoid
util::point<S,ValueT> origin; cruft::point<S,ValueT> origin;
// the distance from the centre along each axis to the shape's edge // the distance from the centre along each axis to the shape's edge
util::vector<S,ValueT> radius; cruft::vector<S,ValueT> radius;
// the orientation of up for the shape // the orientation of up for the shape
util::vector<S,ValueT> up; cruft::vector<S,ValueT> up;
}; };
using ellipse2f = ellipse<2,float>; using ellipse2f = ellipse<2,float>;
@ -99,7 +99,7 @@ namespace util::geom {
// this isn't guaranteed to be optimal in any specific sense. but it // this isn't guaranteed to be optimal in any specific sense. but it
// ought not be outrageously inefficient... // ought not be outrageously inefficient...
ellipse3f ellipse3f
cover (util::view<const point3f*>); cover (cruft::view<const point3f*>);
/// returns a point that is uniformly distributed about the ellipse /// returns a point that is uniformly distributed about the ellipse
@ -112,7 +112,7 @@ namespace util::geom {
/// ///
/// the concept was taken from: https://math.stackexchange.com/a/2514182 /// the concept was taken from: https://math.stackexchange.com/a/2514182
template <typename RandomT> template <typename RandomT>
util::point3f cruft::point3f
sample_surface (ellipse3f self, RandomT &generator) sample_surface (ellipse3f self, RandomT &generator)
{ {
const auto [a, b, c] = self.radius; const auto [a, b, c] = self.radius;
@ -128,7 +128,7 @@ namespace util::geom {
// find the distance to the surface along the direction vector // find the distance to the surface along the direction vector
auto const d = std::sqrt (x * x / a2 + y * y / b2 + z * z / c2); auto const d = std::sqrt (x * x / a2 + y * y / b2 + z * z / c2);
return self.origin + util::vector3f {x,y,z} / d; return self.origin + cruft::vector3f {x,y,z} / d;
} }
@ -144,21 +144,21 @@ namespace util::geom {
#include <cmath> #include <cmath>
#include <random> #include <random>
namespace util::geom { namespace cruft::geom {
template <typename T, template <size_t,typename> class K, typename G> template <typename T, template <size_t,typename> class K, typename G>
struct sampler<2,T,K,G> struct sampler<2,T,K,G>
{ {
static util::point<2,T> fn (K<2,T> k, G &g) static cruft::point<2,T> fn (K<2,T> k, G &g)
{ {
std::uniform_real_distribution<T> dist; std::uniform_real_distribution<T> dist;
float phi = dist (g) * 2 * pi<T>; float phi = dist (g) * 2 * pi<T>;
float rho = std::sqrt (dist (g)); float rho = std::sqrt (dist (g));
return util::point<2,T> { return cruft::point<2,T> {
std::cos (phi), std::cos (phi),
std::sin (phi) std::sin (phi)
} * rho * k.radius + k.origin.template as<util::vector> (); } * rho * k.radius + k.origin.template as<cruft::vector> ();
} }
}; };
} }

View File

@ -8,7 +8,7 @@
#include "frustum.hpp" #include "frustum.hpp"
using util::geom::frustum; using cruft::geom::frustum;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -57,4 +57,4 @@ frustum<T>::frustum (const matrix4<T> &transform)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template struct util::geom::frustum<float>; template struct cruft::geom::frustum<float>;

View File

@ -17,7 +17,7 @@
#include <cstddef> #include <cstddef>
namespace util::geom { namespace cruft::geom {
/// a viewing frustrum comprised of 4 axis planes, a near plane, and a far /// a viewing frustrum comprised of 4 axis planes, a near plane, and a far
/// plane. it may describe something other than a perspective projection /// plane. it may describe something other than a perspective projection
/// (eg, an orthographic projection) /// (eg, an orthographic projection)

View File

@ -11,7 +11,7 @@
#include <cstdlib> #include <cstdlib>
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T> struct ray; template <size_t S, typename T> struct ray;
template <size_t S, typename T> struct plane; template <size_t S, typename T> struct plane;
template <size_t S, typename T> struct aabb; template <size_t S, typename T> struct aabb;

View File

@ -17,39 +17,39 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
util::geom::operator<< (std::ostream &os, util::geom::sphere<S,T> s) cruft::geom::operator<< (std::ostream &os, cruft::geom::sphere<S,T> s)
{ {
return os << "sphere(" << s.centre << ',' << s.radius << ')'; return os << "sphere(" << s.centre << ',' << s.radius << ')';
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template std::ostream& util::geom::operator<< (std::ostream&, util::geom::sphere<2,float>); template std::ostream& cruft::geom::operator<< (std::ostream&, cruft::geom::sphere<2,float>);
template std::ostream& util::geom::operator<< (std::ostream&, util::geom::sphere<3,float>); template std::ostream& cruft::geom::operator<< (std::ostream&, cruft::geom::sphere<3,float>);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
util::geom::operator<< (std::ostream &os, plane<S,T> val) cruft::geom::operator<< (std::ostream &os, plane<S,T> val)
{ {
return os << val.coefficients; return os << val.coefficients;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template std::ostream& util::geom::operator<< (std::ostream&, plane<2,float>); template std::ostream& cruft::geom::operator<< (std::ostream&, plane<2,float>);
template std::ostream& util::geom::operator<< (std::ostream&, plane<3,float>); template std::ostream& cruft::geom::operator<< (std::ostream&, plane<3,float>);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <typename T> template <typename T>
std::ostream& std::ostream&
util::geom::operator<< (std::ostream &os, frustum<T> val) cruft::geom::operator<< (std::ostream &os, frustum<T> val)
{ {
return os << "[ " << util::make_infix (val.planes) << " ]"; return os << "[ " << cruft::make_infix (val.planes) << " ]";
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template std::ostream& util::geom::operator<< (std::ostream&, frustum<float>); template std::ostream& cruft::geom::operator<< (std::ostream&, frustum<float>);

View File

@ -15,7 +15,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
operator<< (std::ostream&, aabb<S,T>); operator<< (std::ostream&, aabb<S,T>);

View File

@ -11,26 +11,26 @@
#include "../point.hpp" #include "../point.hpp"
#include "../vector.hpp" #include "../vector.hpp"
namespace util::geom { namespace cruft::geom {
// an line of infinite extent that passes though 'base'. // an line of infinite extent that passes though 'base'.
// //
// direction should be normalised // direction should be normalised
template <size_t S, typename T> template <size_t S, typename T>
struct line { struct line {
line () = default; line () = default;
line (util::point<S,T> a, util::point<S,T> b): line (cruft::point<S,T> a, cruft::point<S,T> b):
line (a, normalised (b - a)) line (a, normalised (b - a))
{ ; } { ; }
line (util::point<S,T> _base, util::vector<S,T> _direction): line (cruft::point<S,T> _base, cruft::vector<S,T> _direction):
base (_base), base (_base),
direction (_direction) direction (_direction)
{ {
CHECK (is_normalised (direction)); CHECK (is_normalised (direction));
} }
util::point<S,T> base; cruft::point<S,T> base;
util::vector<S,T> direction; cruft::vector<S,T> direction;
}; };
using line2f = line<2,float>; using line2f = line<2,float>;

View File

@ -16,7 +16,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::geom { namespace cruft::geom {
template < template <
size_t S, size_t S,
typename T, typename T,
@ -43,8 +43,8 @@ namespace util::geom {
template <size_t,typename> class A, template <size_t,typename> class A,
template <size_t,typename> class B, template <size_t,typename> class B,
typename = std::enable_if_t< typename = std::enable_if_t<
!std::is_same_v<util::point<S,T>, A> && !std::is_same_v<cruft::point<S,T>, A> &&
!std::is_same_v<util::point<S,T>, B> !std::is_same_v<cruft::point<S,T>, B>
> >
> >
T T

View File

@ -11,7 +11,7 @@
#include "../debug.hpp" #include "../debug.hpp"
using util::geom::plane; using cruft::geom::plane;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -26,5 +26,5 @@ plane<S,T>::plane (point<S,T> base, vector<S,T> normal)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template struct util::geom::plane<2,float>; template struct cruft::geom::plane<2,float>;
template struct util::geom::plane<3,float>; template struct cruft::geom::plane<3,float>;

View File

@ -12,18 +12,18 @@
#include "../vector.hpp" #include "../vector.hpp"
#include "../matrix.hpp" #include "../matrix.hpp"
namespace util::geom { namespace cruft::geom {
/// represents an S dimensional plane in parametric form: ax + by + cz + d = 0 /// represents an S dimensional plane in parametric form: ax + by + cz + d = 0
template <size_t S, typename T> template <size_t S, typename T>
struct plane { struct plane {
plane () = default; plane () = default;
plane (util::point<S,T> base, util::vector<S,T> normal); plane (cruft::point<S,T> base, cruft::vector<S,T> normal);
explicit plane (util::vector<S+1,T> _coefficients): explicit plane (cruft::vector<S+1,T> _coefficients):
coefficients (_coefficients) coefficients (_coefficients)
{ ; } { ; }
util::vector<S+1,T> coefficients; cruft::vector<S+1,T> coefficients;
}; };
@ -31,7 +31,7 @@ namespace util::geom {
typedef plane<3,float> plane3f; typedef plane<3,float> plane3f;
inline plane3f inline plane3f
make_plane (util::point3f a, util::point3f b, util::point3f c) make_plane (cruft::point3f a, cruft::point3f b, cruft::point3f c)
{ {
return plane3f (a, normalised (cross (b - a, c - a))); return plane3f (a, normalised (cross (b - a, c - a)));
} }
@ -40,7 +40,7 @@ namespace util::geom {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/// returns the normal for a plane /// returns the normal for a plane
template <size_t S, typename T> template <size_t S, typename T>
util::vector<S,T> cruft::vector<S,T>
normal (plane<S,T> p) normal (plane<S,T> p)
{ {
return p.coefficients.template redim<S> (); return p.coefficients.template redim<S> ();
@ -106,7 +106,7 @@ namespace util::geom {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
auto auto
furthest (plane<S,T> p, const std::vector<util::point<S,T>> &cloud) furthest (plane<S,T> p, const std::vector<cruft::point<S,T>> &cloud)
{ {
T maxd = -INFINITY; T maxd = -INFINITY;
auto best = cloud.begin (); auto best = cloud.begin ();
@ -123,5 +123,5 @@ namespace util::geom {
template <size_t S, typename T> template <size_t S, typename T>
auto auto
furthest (plane<S,T>, std::vector<util::point<S,T>> &&) = delete; furthest (plane<S,T>, std::vector<cruft::point<S,T>> &&) = delete;
} }

View File

@ -13,7 +13,7 @@
#include "../coord/iostream.hpp" #include "../coord/iostream.hpp"
#include "../debug.hpp" #include "../debug.hpp"
using util::geom::ray; using cruft::geom::ray;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -29,7 +29,7 @@ ray<S,T>::closest (point<S,T> q) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
template <size_t S, typename T> template <size_t S, typename T>
util::point<S,T> cruft::point<S,T>
ray<S,T>::at (T t) const ray<S,T>::at (T t) const
{ {
return origin + direction * t; return origin + direction * t;
@ -39,7 +39,7 @@ ray<S,T>::at (T t) const
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
std::ostream& std::ostream&
util::geom::operator<< (std::ostream &os, ray<S,T> r) cruft::geom::operator<< (std::ostream &os, ray<S,T> r)
{ {
return os << "ray(" << r.origin << ',' << r.direction << ')'; return os << "ray(" << r.origin << ',' << r.direction << ')';
} }
@ -47,12 +47,12 @@ util::geom::operator<< (std::ostream &os, ray<S,T> r)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
struct util::debug::validator<ray<S,T>> { struct cruft::debug::validator<ray<S,T>> {
static bool static bool
is_valid (ray<S,T> const& val) is_valid (ray<S,T> const& val)
{ {
return util::debug::is_valid (val.origin) && return cruft::debug::is_valid (val.origin) &&
util::debug::is_valid (val.direction) && cruft::debug::is_valid (val.direction) &&
is_normalised (val.direction); is_normalised (val.direction);
} }
}; };
@ -60,9 +60,9 @@ struct util::debug::validator<ray<S,T>> {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define INSTANTIATE_S_T(S,T) \ #define INSTANTIATE_S_T(S,T) \
template std::ostream& util::geom::operator<< (std::ostream&, ray<S,T>); \ template std::ostream& cruft::geom::operator<< (std::ostream&, ray<S,T>); \
template struct util::debug::validator<ray<S,T>>; \ template struct cruft::debug::validator<ray<S,T>>; \
template struct util::geom::ray<S,T>; template struct cruft::geom::ray<S,T>;
INSTANTIATE_S_T(2,float) INSTANTIATE_S_T(2,float)

View File

@ -18,13 +18,13 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T> template <size_t S, typename T>
struct ray { struct ray {
// queries // queries
T closest (point<S,T>) const; T closest (point<S,T>) const;
util::point<S,T> at (T) const; cruft::point<S,T> at (T) const;
// data members // data members
point<S,T> origin; point<S,T> origin;

View File

@ -18,7 +18,7 @@
#include <random> #include <random>
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::geom { namespace cruft::geom {
/// a function object that selects a uniformly random point inside a shape /// a function object that selects a uniformly random point inside a shape
/// using a provided random generator. the point will lie within the shape, /// using a provided random generator. the point will lie within the shape,
/// inclusive of boundaries. /// inclusive of boundaries.
@ -68,8 +68,8 @@ namespace util::geom {
} }
std::vector<util::point2f> std::vector<cruft::point2f>
poisson_sample (util::extent2i, float distance, int samples); poisson_sample (cruft::extent2i, float distance, int samples);
namespace surface { namespace surface {
@ -83,17 +83,17 @@ namespace util::geom {
//--------------------------------------------------------------------- //---------------------------------------------------------------------
template <size_t S, typename T> template <size_t S, typename T>
class sampler<util::extent<S,T>> { class sampler<cruft::extent<S,T>> {
public: public:
sampler (util::extent<S,T> _target): sampler (cruft::extent<S,T> _target):
target (_target) target (_target)
{ ; } { ; }
template <typename GeneratorT> template <typename GeneratorT>
util::point<S,T> cruft::point<S,T>
operator() (GeneratorT &&gen) const noexcept operator() (GeneratorT &&gen) const noexcept
{ {
util::point<S,T> p; cruft::point<S,T> p;
for (size_t i = 0; i < S; ++i) { for (size_t i = 0; i < S; ++i) {
if constexpr (std::is_floating_point_v<T>) { if constexpr (std::is_floating_point_v<T>) {
@ -108,7 +108,7 @@ namespace util::geom {
} }
private: private:
util::extent<S,T> target; cruft::extent<S,T> target;
}; };
/// approximate a poisson disc sampling through mitchell's best candidate. /// approximate a poisson disc sampling through mitchell's best candidate.
@ -161,10 +161,10 @@ namespace util::geom {
// find the minimum distance from this candidate to the // find the minimum distance from this candidate to the
// selected points // selected points
for (auto q: selected) for (auto q: selected)
d2 = util::min (d2, util::distance2 (p, q)); d2 = cruft::min (d2, cruft::distance2 (p, q));
// record if it's the furthest away // record if it's the furthest away
if (d2 > best_distance2 && d2 > util::pow (minimum_distance (p), 2)) { if (d2 > best_distance2 && d2 > cruft::pow (minimum_distance (p), 2)) {
best_distance2 = d2; best_distance2 = d2;
best_index = i; best_index = i;
} }

View File

@ -11,11 +11,11 @@
#include "../point.hpp" #include "../point.hpp"
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T> template <size_t S, typename T>
struct segment { struct segment {
util::point<S,T> a; cruft::point<S,T> a;
util::point<S,T> b; cruft::point<S,T> b;
}; };

View File

@ -8,5 +8,5 @@
#include "sphere.hpp" #include "sphere.hpp"
using util::geom::sphere; using cruft::geom::sphere;

View File

@ -15,7 +15,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
namespace util::geom { namespace cruft::geom {
template <size_t S, typename T> template <size_t S, typename T>
struct sphere { struct sphere {
point<S,T> centre; point<S,T> centre;

View File

@ -15,7 +15,7 @@
#include <cstddef> #include <cstddef>
#include <random> #include <random>
namespace util::geom { namespace cruft::geom {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
template <size_t S, typename T> template <size_t S, typename T>
struct tri { struct tri {
@ -24,7 +24,7 @@ namespace util::geom {
a (_a), b (_b), c (_c) a (_a), b (_b), c (_c)
{ ; } { ; }
util::point<S,T> a, b, c; cruft::point<S,T> a, b, c;
}; };
template <size_t S, typename T> template <size_t S, typename T>
@ -44,7 +44,7 @@ namespace util::geom {
{ ; } { ; }
template <typename GeneratorT> template <typename GeneratorT>
util::point<S,T> cruft::point<S,T>
operator() (GeneratorT &&gen) const noexcept operator() (GeneratorT &&gen) const noexcept
{ {
std::uniform_real_distribution<float> dist (0, 1); std::uniform_real_distribution<float> dist (0, 1);
@ -52,8 +52,8 @@ namespace util::geom {
} }
private: private:
util::point<S,T> base; cruft::point<S,T> base;
util::vector<S,T> v0, v1; cruft::vector<S,T> v0, v1;
}; };
}; };
@ -65,9 +65,9 @@ namespace util::geom {
area (tri<DimensionV,ValueT> obj) area (tri<DimensionV,ValueT> obj)
{ {
// heron's formula // heron's formula
const auto ab = util::distance (obj.a, obj.b); const auto ab = cruft::distance (obj.a, obj.b);
const auto bc = util::distance (obj.b, obj.c); const auto bc = cruft::distance (obj.b, obj.c);
const auto ca = util::distance (obj.c, obj.a); const auto ca = cruft::distance (obj.c, obj.a);
const auto s = (ab + bc + ca) / 2; const auto s = (ab + bc + ca) / 2;

View File

@ -14,7 +14,7 @@
#include <cstdint> #include <cstdint>
#include <cstdlib> #include <cstdlib>
namespace util::hash { namespace cruft::hash {
constexpr std::uint32_t constexpr std::uint32_t
mix (std::uint32_t a, std::uint32_t b) mix (std::uint32_t a, std::uint32_t b)
{ {

View File

@ -10,7 +10,7 @@
static constexpr unsigned MODULUS = 65521; static constexpr unsigned MODULUS = 65521;
using util::hash::adler32; using cruft::hash::adler32;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

Some files were not shown because too many files have changed in this diff Show More