diff --git a/CMakeLists.txt b/CMakeLists.txt
index 255cb20..e09c673 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25)
-project(blt-gp VERSION 0.0.5)
+project(blt-gp VERSION 0.0.6)
option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF)
option(ENABLE_UBSAN "Enable the ub sanitizer" OFF)
@@ -42,8 +42,8 @@ if (${BUILD_EXAMPLES})
target_link_libraries(blt-gp-example PUBLIC BLT blt-gp)
- target_compile_options(blt-gp-example PRIVATE -Wall -Wextra -Werror -Wpedantic -Wno-comment)
- target_link_options(blt-gp-example PRIVATE -Wall -Wextra -Werror -Wpedantic -Wno-comment)
+ target_compile_options(blt-gp-example PRIVATE -Wall -Wextra -Wpedantic -Wno-comment)
+ target_link_options(blt-gp-example PRIVATE -Wall -Wextra -Wpedantic -Wno-comment)
if (${ENABLE_ADDRSAN} MATCHES ON)
target_compile_options(blt-gp-example PRIVATE -fsanitize=address)
diff --git a/examples/main.cpp b/examples/main.cpp
index 639b0dd..56da706 100644
--- a/examples/main.cpp
+++ b/examples/main.cpp
@@ -16,8 +16,23 @@
* along with this program. If not, see .
*/
#include
+#include
int main()
{
+ blt::gp::operation silly([](float f, int i, bool b) -> float {
+ return static_cast(b);
+ });
+
+ float f = 10.5;
+ int i = 412;
+ bool b = true;
+
+ std::array arr{reinterpret_cast(&f), reinterpret_cast(&i), reinterpret_cast(&b)};
+
+ blt::span spv{arr};
+
+ std::cout << silly.operator()(spv) << std::endl;
+
std::cout << "Hello World!" << std::endl;
}
\ No newline at end of file
diff --git a/include/blt/gp/program.h b/include/blt/gp/program.h
index de1b584..9d98755 100644
--- a/include/blt/gp/program.h
+++ b/include/blt/gp/program.h
@@ -22,7 +22,12 @@
#include
#include
#include
+#include
+#include
#include
+#include
+#include
+#include
namespace blt::gp
{
@@ -30,6 +35,95 @@ namespace blt::gp
{
};
+ class type
+ {
+ public:
+ template
+ static type make_type(blt::size_t id)
+ {
+ return type(sizeof(T), id, blt::type_string());
+ }
+
+ [[nodiscard]] blt::size_t size() const
+ {
+ return size_;
+ }
+
+ [[nodiscard]] blt::size_t id() const
+ {
+ return id_;
+ }
+
+ [[nodiscard]] std::string_view name() const
+ {
+ return name_;
+ }
+
+ private:
+ type(size_t size, size_t id, std::string_view name): size_(size), id_(id), name_(name)
+ {}
+
+ blt::size_t size_;
+ blt::size_t id_;
+ std::string name_;
+ };
+
+ class type_system
+ {
+ public:
+ type_system() = default;
+
+ template
+ inline type register_type()
+ {
+ types.push_back(type::make_type(types.size()));
+ return types.back();
+ }
+
+ private:
+ std::vector types;
+ };
+
+ class stack_allocator
+ {
+ constexpr static blt::size_t BLOCK_SIZE = 4096;
+ public:
+
+ private:
+ template
+ static inline auto to_block(T* p)
+ {
+ return reinterpret_cast(reinterpret_cast(p) & static_cast(~(BLOCK_SIZE - 1)));
+ }
+
+ struct block
+ {
+ struct block_metadata_t
+ {
+ block* next = nullptr;
+ block* prev = nullptr;
+ blt::u8* offset = nullptr;
+ } metadata;
+ blt::u8 buffer[BLOCK_SIZE - sizeof(block_metadata_t)]{};
+
+ block()
+ {
+ metadata.offset = buffer;
+ }
+
+ // remaining space inside the block after accounting for the metadata
+ static constexpr blt::size_t BLOCK_REMAINDER = BLOCK_SIZE - sizeof(typename block::block_metadata_t);
+ };
+
+ static block* allocate_block()
+ {
+ return reinterpret_cast(std::aligned_alloc(BLOCK_SIZE, BLOCK_SIZE));
+ }
+
+ private:
+ block* head = nullptr;
+ };
+
template
class operation
{
@@ -40,18 +134,16 @@ namespace blt::gp
operation(operation&& move) = default;
- template
+ template, void>>
+ explicit operation(const T& functor): func(functor)
+ {}
+
+ template, void>>
explicit operation(const T& functor)
{
- if constexpr (std::is_same_v)
- {
- func = functor;
- } else
- {
- func = [&functor](Args... args) {
- return functor(args...);
- };
- }
+ func = [&functor](Args... args) {
+ return functor(args...);
+ };
}
explicit operation(function_t&& functor): func(std::move(functor))
@@ -62,21 +154,35 @@ namespace blt::gp
return func(args...);
}
- inline Return operator()(blt::span args)
+ Return operator()(blt::span args)
{
-
+ auto pack_sequence = std::make_integer_sequence();
+ return function_evaluator(args, pack_sequence);
+ }
+
+ std::function)> to_functor()
+ {
+ return [this](blt::span args) {
+ return this->operator()(args);
+ };
}
private:
+ template
+ static inline T& access_pack_index(blt::span args)
+ {
+ return *reinterpret_cast(args[index]);
+ }
+
+ template
+ Return function_evaluator(blt::span args, std::integer_sequence)
+ {
+ return func(access_pack_index(args)...);
+ }
+
function_t func;
};
- template
- class operations
- {
-
- };
-
}
diff --git a/lib/blt b/lib/blt
index a8b2bc2..bc68e6d 160000
--- a/lib/blt
+++ b/lib/blt
@@ -1 +1 @@
-Subproject commit a8b2bc2d010480544c3162daa7384a252946bda1
+Subproject commit bc68e6dd4a3dfa1de9be2fb8e9302b52c4f3db5c