util/Intrusive*: move `constant_time_size` to an options struct
This makes it easier to add more options later.
This commit is contained in:
parent
1f495efb46
commit
f01793ad4a
|
@ -49,7 +49,7 @@ struct Partition final : QueueListener, PlayerListener, MixerListener {
|
|||
|
||||
std::unique_ptr<ClientListener> listener;
|
||||
|
||||
IntrusiveList<Client, ClientPerPartitionListHook, false> clients;
|
||||
IntrusiveList<Client, ClientPerPartitionListHook> clients;
|
||||
|
||||
/**
|
||||
* Monitor for idle events local to this partition.
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// Copyright The Music Player Daemon Project
|
||||
|
||||
#ifndef MPD_REMOTE_TAG_CACHE_HXX
|
||||
#define MPD_REMOTE_TAG_CACHE_HXX
|
||||
#pragma once
|
||||
|
||||
#include "input/RemoteTagScanner.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
|
@ -84,12 +83,13 @@ class RemoteTagCache final {
|
|||
*/
|
||||
ItemList invoke_list;
|
||||
|
||||
IntrusiveHashSet<Item, 127,
|
||||
IntrusiveHashSetOperators<std::hash<std::string_view>,
|
||||
std::equal_to<std::string_view>,
|
||||
Item::GetUri>,
|
||||
IntrusiveHashSetBaseHookTraits<Item>,
|
||||
true> map;
|
||||
IntrusiveHashSet<
|
||||
Item, 127,
|
||||
IntrusiveHashSetOperators<std::hash<std::string_view>,
|
||||
std::equal_to<std::string_view>,
|
||||
Item::GetUri>,
|
||||
IntrusiveHashSetBaseHookTraits<Item>,
|
||||
IntrusiveHashSetOptions{.constant_time_size = true}> map;
|
||||
|
||||
public:
|
||||
RemoteTagCache(EventLoop &event_loop,
|
||||
|
@ -107,5 +107,3 @@ private:
|
|||
|
||||
void ItemResolved(Item &item) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,15 +1,16 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// Copyright The Music Player Daemon Project
|
||||
|
||||
#ifndef MPD_CLIENT_LIST_HXX
|
||||
#define MPD_CLIENT_LIST_HXX
|
||||
#pragma once
|
||||
|
||||
#include "Client.hxx"
|
||||
#include "util/IntrusiveList.hxx"
|
||||
|
||||
class ClientList {
|
||||
using List =
|
||||
IntrusiveList<Client, IntrusiveListMemberHookTraits<&Client::list_siblings>, true>;
|
||||
using List = IntrusiveList<
|
||||
Client,
|
||||
IntrusiveListMemberHookTraits<&Client::list_siblings>,
|
||||
IntrusiveListOptions{.constant_time_size = true}>;
|
||||
|
||||
const unsigned max_size;
|
||||
|
||||
|
@ -39,5 +40,3 @@ public:
|
|||
|
||||
void Remove(Client &client) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,8 +6,7 @@
|
|||
* Internal declarations for the "httpd" audio output plugin.
|
||||
*/
|
||||
|
||||
#ifndef MPD_OUTPUT_HTTPD_INTERNAL_H
|
||||
#define MPD_OUTPUT_HTTPD_INTERNAL_H
|
||||
#pragma once
|
||||
|
||||
#include "HttpdClient.hxx"
|
||||
#include "output/Interface.hxx"
|
||||
|
@ -121,8 +120,9 @@ private:
|
|||
* A linked list containing all clients which are currently
|
||||
* connected.
|
||||
*/
|
||||
IntrusiveList<HttpdClient, IntrusiveListBaseHookTraits<HttpdClient>,
|
||||
true> clients;
|
||||
IntrusiveList<
|
||||
HttpdClient, IntrusiveListBaseHookTraits<HttpdClient>,
|
||||
IntrusiveListOptions{.constant_time_size = true}> clients;
|
||||
|
||||
/**
|
||||
* The maximum number of clients connected at the same time.
|
||||
|
@ -255,5 +255,3 @@ private:
|
|||
};
|
||||
|
||||
extern const class Domain httpd_output_domain;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -14,6 +14,10 @@
|
|||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
struct IntrusiveForwardListOptions {
|
||||
bool constant_time_size = false;
|
||||
};
|
||||
|
||||
struct IntrusiveForwardListNode {
|
||||
IntrusiveForwardListNode *next;
|
||||
};
|
||||
|
@ -93,8 +97,10 @@ struct IntrusiveForwardListMemberHookTraits {
|
|||
*/
|
||||
template<typename T,
|
||||
typename HookTraits=IntrusiveForwardListBaseHookTraits<T>,
|
||||
bool constant_time_size=false>
|
||||
IntrusiveForwardListOptions options=IntrusiveForwardListOptions{}>
|
||||
class IntrusiveForwardList {
|
||||
static constexpr bool constant_time_size = options.constant_time_size;
|
||||
|
||||
IntrusiveForwardListNode head{nullptr};
|
||||
|
||||
[[no_unique_address]]
|
||||
|
@ -145,7 +151,7 @@ public:
|
|||
:head(src.head)
|
||||
{
|
||||
// shallow copies mess with the counter
|
||||
static_assert(!constant_time_size);
|
||||
static_assert(!options.constant_time_size);
|
||||
}
|
||||
|
||||
IntrusiveForwardList &operator=(IntrusiveForwardList &&src) noexcept {
|
||||
|
|
|
@ -10,6 +10,10 @@
|
|||
#include <array>
|
||||
#include <numeric> // for std::accumulate()
|
||||
|
||||
struct IntrusiveHashSetOptions {
|
||||
bool constant_time_size = false;
|
||||
};
|
||||
|
||||
template<IntrusiveHookMode mode=IntrusiveHookMode::NORMAL>
|
||||
struct IntrusiveHashSetHook {
|
||||
using SiblingsHook = IntrusiveListHook<mode>;
|
||||
|
@ -106,8 +110,10 @@ struct IntrusiveHashSetOperators {
|
|||
template<typename T, std::size_t table_size,
|
||||
typename Operators,
|
||||
typename HookTraits=IntrusiveHashSetBaseHookTraits<T>,
|
||||
bool constant_time_size=false>
|
||||
IntrusiveHashSetOptions options=IntrusiveHashSetOptions{}>
|
||||
class IntrusiveHashSet {
|
||||
static constexpr bool constant_time_size = options.constant_time_size;
|
||||
|
||||
[[no_unique_address]]
|
||||
OptionalCounter<constant_time_size> counter;
|
||||
|
||||
|
|
|
@ -13,6 +13,10 @@
|
|||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
struct IntrusiveListOptions {
|
||||
bool constant_time_size = false;
|
||||
};
|
||||
|
||||
struct IntrusiveListNode {
|
||||
IntrusiveListNode *next, *prev;
|
||||
|
||||
|
@ -27,7 +31,7 @@ template<IntrusiveHookMode _mode=IntrusiveHookMode::NORMAL>
|
|||
class IntrusiveListHook {
|
||||
template<typename T> friend struct IntrusiveListBaseHookTraits;
|
||||
template<auto member> friend struct IntrusiveListMemberHookTraits;
|
||||
template<typename T, typename HookTraits, bool> friend class IntrusiveList;
|
||||
template<typename T, typename HookTraits, IntrusiveListOptions> friend class IntrusiveList;
|
||||
|
||||
protected:
|
||||
IntrusiveListNode siblings;
|
||||
|
@ -135,8 +139,10 @@ struct IntrusiveListMemberHookTraits {
|
|||
*/
|
||||
template<typename T,
|
||||
typename HookTraits=IntrusiveListBaseHookTraits<T>,
|
||||
bool constant_time_size=false>
|
||||
IntrusiveListOptions options=IntrusiveListOptions{}>
|
||||
class IntrusiveList {
|
||||
static constexpr bool constant_time_size = options.constant_time_size;
|
||||
|
||||
IntrusiveListNode head{&head, &head};
|
||||
|
||||
[[no_unique_address]]
|
||||
|
|
|
@ -14,11 +14,11 @@
|
|||
*/
|
||||
template<typename T, typename Compare=typename T::Compare,
|
||||
typename HookTraits=IntrusiveListBaseHookTraits<T>,
|
||||
bool constant_time_size=false>
|
||||
IntrusiveListOptions options=IntrusiveListOptions{}>
|
||||
class IntrusiveSortedList
|
||||
: public IntrusiveList<T, HookTraits, constant_time_size>
|
||||
: public IntrusiveList<T, HookTraits, options>
|
||||
{
|
||||
using Base = IntrusiveList<T, HookTraits, constant_time_size>;
|
||||
using Base = IntrusiveList<T, HookTraits, options>;
|
||||
|
||||
[[no_unique_address]]
|
||||
Compare compare;
|
||||
|
|
Loading…
Reference in New Issue