Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add graph sample. #71

Merged
merged 4 commits into from
Oct 30, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions develop/matchit.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Replace include/matchit.h with this file when developing.

#include "../develop/matchit/core.h"
#include "../develop/matchit/expression.h"
#include "../develop/matchit/patterns.h"
#include "../develop/matchit/utility.h"
43 changes: 22 additions & 21 deletions develop/matchit/patterns.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,22 @@ namespace matchit
static_assert(std::is_same_v<decayArrayT<int32_t const[]>, int32_t const *>);
static_assert(std::is_same_v<decayArrayT<int32_t const &>, int32_t const &>);

template <typename T>
struct AddConstToPointer
{
using type = std::conditional_t<
!std::is_pointer_v<T>, T,
std::add_pointer_t<std::add_const_t<std::remove_pointer_t<T>>>>;
};
template <typename T>
using AddConstToPointerT = typename AddConstToPointer<T>::type;

static_assert(std::is_same_v<AddConstToPointerT<void *>, void const *>);
static_assert(std::is_same_v<AddConstToPointerT<int32_t>, int32_t>);

template <typename Pattern>
using InternalPatternT = std::remove_reference_t<AddConstToPointerT<decayArrayT<Pattern>>>;

template <typename Pattern>
class PatternTraits;

Expand Down Expand Up @@ -310,7 +326,7 @@ namespace matchit

private:
Pattern const mPattern;
Func const mHandler;
std::conditional_t<std::is_function_v<Func>, Func const &, Func const> mHandler;
};

template <typename Pattern, typename Pred>
Expand Down Expand Up @@ -439,7 +455,7 @@ namespace matchit
constexpr auto const &patterns() const { return mPatterns; }

private:
std::tuple<Patterns...> mPatterns;
std::tuple<InternalPatternT<Patterns>...> mPatterns;
};

template <typename... Patterns>
Expand Down Expand Up @@ -530,7 +546,7 @@ namespace matchit

private:
Unary const mUnary;
Pattern const mPattern;
InternalPatternT<Pattern> const mPattern;
};

template <typename Unary, typename Pattern>
Expand Down Expand Up @@ -602,7 +618,7 @@ namespace matchit
constexpr auto const &patterns() const { return mPatterns; }

private:
std::tuple<Patterns...> mPatterns;
std::tuple<InternalPatternT<Patterns>...> mPatterns;
};

template <typename... Patterns>
Expand Down Expand Up @@ -681,7 +697,7 @@ namespace matchit
auto const &pattern() const { return mPattern; }

private:
Pattern mPattern;
InternalPatternT<Pattern> mPattern;
};

template <typename Pattern>
Expand Down Expand Up @@ -944,22 +960,7 @@ namespace matchit
constexpr explicit Ds(Patterns const &...patterns) : mPatterns{patterns...} {}
constexpr auto const &patterns() const { return mPatterns; }

private:
template <typename T>
struct AddConstToPointer
{
using type = std::conditional_t<
!std::is_pointer_v<T>, T,
std::add_pointer_t<std::add_const_t<std::remove_pointer_t<T>>>>;
};
template <typename T>
using AddConstToPointerT = typename AddConstToPointer<T>::type;

static_assert(std::is_same_v<AddConstToPointerT<void *>, void const *>);
static_assert(std::is_same_v<AddConstToPointerT<int32_t>, int32_t>);

public:
using Type = std::tuple<AddConstToPointerT<decayArrayT<Patterns>>...>;
using Type = std::tuple<InternalPatternT<Patterns>...>;

private:
Type mPatterns;
Expand Down
10 changes: 6 additions & 4 deletions develop/matchit/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,19 @@ namespace matchit
{ return false; });
}

constexpr auto dsVia = [](auto &&...members)
constexpr auto dsVia = [](auto ...members)
{
return [members...](auto &&...pats)
return [members...](auto ...pats)
{ return and_(app(members, pats)...); };
};

template <typename T>
constexpr auto asDsVia = [](auto &&...members)
constexpr auto asDsVia = [](auto ...members)
{
return [members...](auto &&...pats)
return [members...](auto ...pats)
{
// FIXME, why the following line will cause segfault in at-Bindings.cpp
// return as<T>(dsVia(members...)(pats...));
return as<T>(and_(app(members, pats)...));
};
};
Expand Down
Loading