Commit 7e1b6857 authored by neverlord's avatar neverlord

improved pattern performance

parent 19dca133
...@@ -116,19 +116,20 @@ void fill_vecs(size_t pos, ...@@ -116,19 +116,20 @@ void fill_vecs(size_t pos,
dt, utis, data_ptrs); dt, utis, data_ptrs);
} }
template<class TypesArray>
class pattern_iterator class pattern_iterator
{ {
size_t m_pos; size_t m_pos;
size_t m_size; size_t m_size;
void const* const* m_data; void const* const* m_data;
cppa::uniform_type_info const* const* m_types; TypesArray const& m_types;
public: public:
inline pattern_iterator(size_t msize, inline pattern_iterator(size_t msize,
void const* const* mdata, void const* const* mdata,
cppa::uniform_type_info const* const* mtypes) TypesArray const& mtypes)
: m_pos(0) : m_pos(0)
, m_size(msize) , m_size(msize)
, m_data(mdata) , m_data(mdata)
...@@ -289,8 +290,8 @@ class tuple_iterator_arg<any_tuple, VectorType> ...@@ -289,8 +290,8 @@ class tuple_iterator_arg<any_tuple, VectorType>
}; };
template<class T, class VectorType> template<class TypesArray, class T, class VectorType>
bool do_match(pattern_iterator& iter, tuple_iterator_arg<T, VectorType>& targ) bool do_match(pattern_iterator<TypesArray>& iter, tuple_iterator_arg<T, VectorType>& targ)
{ {
for ( ; !(iter.at_end() && targ.at_end()); iter.next(), targ.next()) for ( ; !(iter.at_end() && targ.at_end()); iter.next(), targ.next())
{ {
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "cppa/util/type_list_apply.hpp" #include "cppa/util/type_list_apply.hpp"
#include "cppa/detail/tdata.hpp" #include "cppa/detail/tdata.hpp"
#include "cppa/detail/types_array.hpp"
#include "cppa/detail/pattern_details.hpp" #include "cppa/detail/pattern_details.hpp"
namespace cppa { namespace cppa {
...@@ -77,8 +78,6 @@ class pattern<T0, Tn...> ...@@ -77,8 +78,6 @@ class pattern<T0, Tn...>
pattern() pattern()
{ {
cppa::uniform_type_info const* * iter = m_utis;
detail::fill_uti_vec<decltype(iter), T0, Tn...>(iter);
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
{ {
m_data_ptr[i] = nullptr; m_data_ptr[i] = nullptr;
...@@ -90,17 +89,20 @@ class pattern<T0, Tn...> ...@@ -90,17 +89,20 @@ class pattern<T0, Tn...>
{ {
bool invalid_args[] = { detail::is_boxed<Arg0>::value, bool invalid_args[] = { detail::is_boxed<Arg0>::value,
detail::is_boxed<Args>::value... }; detail::is_boxed<Args>::value... };
detail::fill_vecs<decltype(m_data), T0, Tn...>(0, for (size_t i = 0; i < sizeof...(Args) + 1; ++i)
sizeof...(Args) + 1, {
invalid_args, m_data_ptr[i] = invalid_args[i] ? nullptr : m_data.at(i);
m_data, }
m_utis, m_data_ptr); for (size_t i = sizeof...(Args) + 1; i < size; ++i)
{
m_data_ptr[i] = nullptr;
}
} }
bool operator()(cppa::any_tuple const& msg, bool operator()(cppa::any_tuple const& msg,
mapping_vector* mapping = nullptr) const mapping_vector* mapping = nullptr) const
{ {
detail::pattern_iterator arg0(size, m_data_ptr, m_utis); detail::pattern_iterator<decltype(m_utis)> arg0(size, m_data_ptr, m_utis);
detail::tuple_iterator_arg<any_tuple,mapping_vector> arg1(msg, mapping); detail::tuple_iterator_arg<any_tuple,mapping_vector> arg1(msg, mapping);
return detail::do_match(arg0, arg1); return detail::do_match(arg0, arg1);
} }
...@@ -108,11 +110,15 @@ class pattern<T0, Tn...> ...@@ -108,11 +110,15 @@ class pattern<T0, Tn...>
// private: // private:
detail::tdata<T0, Tn...> m_data; detail::tdata<T0, Tn...> m_data;
cppa::uniform_type_info const* m_utis[size]; //cppa::uniform_type_info const* m_utis[size];
static detail::types_array<T0, Tn...> m_utis;
void const* m_data_ptr[size]; void const* m_data_ptr[size];
}; };
template<typename T0, typename... Tn>
detail::types_array<T0, Tn...> pattern<T0, Tn...>::m_utis;
template<class ExtendedType, class BasicType> template<class ExtendedType, class BasicType>
ExtendedType* extend_pattern(BasicType* p) ExtendedType* extend_pattern(BasicType* p)
{ {
...@@ -120,14 +126,14 @@ ExtendedType* extend_pattern(BasicType* p) ...@@ -120,14 +126,14 @@ ExtendedType* extend_pattern(BasicType* p)
et->m_data = p->m_data; et->m_data = p->m_data;
for (size_t i = 0; i < BasicType::size; ++i) for (size_t i = 0; i < BasicType::size; ++i)
{ {
et->m_utis[i] = p->m_utis[i]; //et->m_utis[i] = p->m_utis[i];
et->m_data_ptr[i] = (p->m_data_ptr[i]) ? et->m_data.at(i) et->m_data_ptr[i] = (p->m_data_ptr[i]) ? et->m_data.at(i)
: nullptr; : nullptr;
} }
for (size_t i = BasicType::size; i < ExtendedType::size; ++i) for (size_t i = BasicType::size; i < ExtendedType::size; ++i)
{ {
et->m_data_ptr[i] = nullptr; et->m_data_ptr[i] = nullptr;
et->m_utis[i] = et->m_data.type_at(i); //et->m_utis[i] = et->m_data.type_at(i);
} }
return et; return et;
} }
......
...@@ -17,16 +17,6 @@ ...@@ -17,16 +17,6 @@
using namespace cppa; using namespace cppa;
void subtest()
{
typedef pattern<int,int,int> i3;
i3 ip;
std::vector<int> vec = {1, 2, 3};
detail::pattern_iterator arg0(i3::size, ip.m_data_ptr, ip.m_utis);
detail::tuple_iterator_arg<std::vector<int>, i3::mapping_vector> arg1(vec);
cout << "match(vec) ( on<int,int,int> =====> " << detail::do_match(arg0, arg1) << endl;
}
template<typename Arr> template<typename Arr>
void plot(Arr const& arr) void plot(Arr const& arr)
{ {
...@@ -51,7 +41,6 @@ size_t test__pattern() ...@@ -51,7 +41,6 @@ size_t test__pattern()
plot(arr1); plot(arr1);
plot(arr2); plot(arr2);
//subtest();
CPPA_TEST(test__pattern); CPPA_TEST(test__pattern);
// some pattern objects to play with // some pattern objects to play with
pattern<atom_value, int, std::string> p0{util::wrapped<atom_value>()}; pattern<atom_value, int, std::string> p0{util::wrapped<atom_value>()};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment