0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-30 22:34:40 +02:00
construct/include/ircd/m/hook.h

79 lines
1.9 KiB
C
Raw Normal View History

2018-02-26 08:24:12 +01:00
// Matrix Construct
//
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 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_M_HOOK_H
namespace ircd::m
{
struct hook;
2018-02-26 08:24:12 +01:00
}
struct ircd::m::hook
:instance_list<hook>
2018-02-26 08:24:12 +01:00
{
struct site;
struct maps;
2018-02-26 08:24:12 +01:00
IRCD_EXCEPTION(ircd::error, error)
json::strung _feature;
json::object feature;
m::event matching;
2018-02-26 08:24:12 +01:00
std::function<void (const m::event &)> function;
bool registered {false};
size_t matchers {0};
2018-05-13 04:43:57 +02:00
size_t calls {0};
2018-02-26 08:24:12 +01:00
string_view site_name() const;
site *find_site() const;
2018-02-26 08:24:12 +01:00
public:
hook(const json::members &, decltype(function));
hook(decltype(function), const json::members &);
2018-02-26 08:24:12 +01:00
hook(hook &&) = delete;
hook(const hook &) = delete;
virtual ~hook() noexcept;
};
/// The hook::site is the call-site for a hook. Each hook site is named
/// and registers itself with the master extern hook::site::list. Each hook
2018-02-26 08:24:12 +01:00
/// then registers itself with a hook::site. The site contains internal
/// state to manage the efficient calling of the participating hooks.
///
/// A hook::site can be created or destroyed at any time (for example if it's
/// in a module which is reloaded) while being agnostic to the hooks it
/// cooperates with.
struct ircd::m::hook::site
:instance_list<site>
2018-02-26 08:24:12 +01:00
{
friend class hook;
2018-02-26 08:24:12 +01:00
json::strung _feature;
json::object feature;
size_t count {0};
std::unique_ptr<hook::maps> maps;
std::set<hook *> hooks;
2018-02-26 08:24:12 +01:00
string_view name() const;
2018-02-26 08:24:12 +01:00
bool add(hook &);
bool del(hook &);
void call(hook &, const event &);
2018-02-26 08:24:12 +01:00
public:
void operator()(const event &);
site(const json::members &);
site(site &&) = delete;
site(const site &) = delete;
~site() noexcept;
2018-02-26 08:24:12 +01:00
};