Skip to content

Commit

Permalink
clang seems to have no issue :/
Browse files Browse the repository at this point in the history
  • Loading branch information
IainWinter committed Apr 19, 2022
1 parent 9541176 commit 2a3c804
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 27 deletions.
1 change: 1 addition & 0 deletions WinterFramework/Entity.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <assert.h>
#include <tuple>
#include <stdint.h>
#include <array>

#include "util/type_info.h" // couples slightly with meta, but should be fine

Expand Down
15 changes: 0 additions & 15 deletions WinterFramework/Serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,21 +213,6 @@ namespace meta
serial->read_value(value);
}

// I have absolutly no idea why these need to be here specifically and arn't even found if I move them just below the internal namespace????
// is this a bug in the compiler, or is there somehting I am missing???????????????? super annoying

template<typename _t> void serial_write(tag<std::vector<_t>>, serial_writer* writer, const std::vector<_t>& instance)
{
writer->write_length(instance.size());
writer->write_array(meta::get_class<_t>(), (void*)instance.data(), instance.size());
}

template<typename _t> void serial_read(tag<std::vector<_t>>, serial_reader* reader, std::vector<_t>& instance)
{
instance.resize(reader->read_length());
reader->read_array(meta::get_class<_t>(), instance.data(), instance.size());
}

namespace internal
{
template<typename _t>
Expand Down
26 changes: 14 additions & 12 deletions WinterFramework/ext/serial_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,20 @@ namespace meta
// Vectors
//

// see serial, these dont get found if they are here
// template<typename _t> void serial_write(tag<std::vector<_t>>, serial_writer* writer, const std::vector<_t>& instance)
// {
// writer->write_length(instance.size());
// writer->write_array(meta::get_class<_t>(), (void*)instance.data(), instance.size());
// }

// template<typename _t> void serial_read(tag<std::vector<_t>>, serial_reader* reader, std::vector<_t>& instance)
// {
// instance.resize(reader->read_length());
// reader->read_array(meta::get_class<_t>(), instance.data(), instance.size());
// }
// g++ doesnt find these
// clang does find these

template<typename _t> void serial_write(tag<std::vector<_t>>, serial_writer* writer, const std::vector<_t>& instance)
{
writer->write_length(instance.size());
writer->write_array(meta::get_class<_t>(), (void*)instance.data(), instance.size());
}

template<typename _t> void serial_read(tag<std::vector<_t>>, serial_reader* reader, std::vector<_t>& instance)
{
instance.resize(reader->read_length());
reader->read_array(meta::get_class<_t>(), instance.data(), instance.size());
}

// typenames, todo: add all of the common ones

Expand Down
47 changes: 47 additions & 0 deletions WinterFramework/test/TemplateTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include <stdio.h>

template<typename _t>
struct test_thing {};

template<typename _t>
struct tag {};

template<typename _t>
void test(tag<_t>)
{
printf("This is a test of a concrete function\n");
}

template<typename _t>
void test(tag<test_thing<_t>>);

struct concrete
{
virtual void test_func() = 0;
};

template<typename _t>
struct templated_struct : concrete
{
void test_func() override
{
test(tag<_t>{});
}
};

int main()
{
concrete* t_int = new templated_struct<int>();
concrete* t_test = new templated_struct<test_thing<int>>();

t_int ->test_func();
t_test->test_func();

return 0;
}

template<typename _t>
void test(tag<test_thing<_t>>)
{
printf("This is a tet of a partial function\n");
}

0 comments on commit 2a3c804

Please sign in to comment.