0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-28 16:34:13 +01:00
construct/include/ircd/globular.h

62 lines
1.7 KiB
C
Raw Normal View History

// Matrix Construct
//
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2019 Jason Volk <jason@zemos.net>
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies. The
// full license for this software is available in the LICENSE file.
#pragma once
#define HAVE_IRCD_GLOBULAR_H
namespace ircd
{
// Globular ('*' and '?') expression utils.
struct globular_imatch;
struct globular_iequals;
}
/// Globular equals. This allows either side of the comparison to include '*'
/// and '?' characters and equality of the string expressions will be
/// determined. Case insensitive.
struct ircd::globular_iequals
:boolean
{
using is_transparent = std::true_type;
bool operator()(const string_view &a, const string_view &b) const noexcept;
template<class A,
class B>
globular_iequals(A&& a, B&& b)
:boolean{operator()(std::forward<A>(a), std::forward<B>(b))}
{}
};
/// Globular match. Similar to globular_equals but only one side of the
/// comparison is considered to be the expression with '*' and '?' characters.
/// The expression string is passed at construction. The comparison inputs are
/// treated as non-expression strings. This allows for greater optimization
/// than globular_equals. Case insensitive.
struct ircd::globular_imatch
{
string_view expr;
template<class A>
bool operator()(A&& a) const noexcept
{
const globular_iequals globular_iequals
{
expr, std::forward<A>(a)
};
return bool(globular_iequals);
}
globular_imatch(const string_view &expr = {})
:expr{expr}
{}
};