]> git.ipfire.org Git - thirdparty/squid.git/blame - src/DescriptorSet.h
Maintenance: Remove FIXME and \todo labels (#647)
[thirdparty/squid.git] / src / DescriptorSet.h
CommitLineData
bbc27441 1/*
77b1029d 2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
bbc27441
AJ
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
877ce944
AR
9#ifndef SQUID_DESCRIPTOR_SET_H
10#define SQUID_DESCRIPTOR_SET_H
11
3d41e53a 12#include <iosfwd>
877ce944 13
9837567d 14/* TODO: Should we use std::set<int> with its flexibility? Our implementation
877ce944 15 has constant overhead, which is smaller than log(n) of std::set.
9837567d
AJ
16*/
17/// An unordered collection of unique descriptors with O(1) add/del/has ops
26ac0430
AJ
18class DescriptorSet
19{
877ce944
AR
20public:
21 // for STL compatibility, should we decide to switch to std::set or similar
22 typedef const int *const_iterator;
23
24 DescriptorSet();
25 ~DescriptorSet();
26
27 /// checks whether fd is in the set
26ac0430
AJ
28 bool has(const int fd) const {
29 return 0 <= fd && fd < capacity_ &&
30 index_[fd] >= 0;
31 }
877ce944
AR
32
33 bool add(int fd); ///< adds if unique; returns true if added
34 bool del(int fd); ///< deletes if there; returns true if deleted
35 int pop(); ///< deletes and returns one descriptor, in unspecified order
36
37 bool empty() const { return !size_; } ///< number of descriptors in the set
38
39 /// begin iterator a la STL; may become invalid if the object is modified
40 const_iterator begin() const { return descriptors_; }
41 /// end iterator a la STL; may become invalid if the object is modified
42 const_iterator end() const { return begin() + size_; }
43
44 /// outputs debugging info about the set
45 void print(std::ostream &os) const;
46
47private:
48 // these would be easy to support when needed; prohibit for now
49 DescriptorSet(const DescriptorSet &s); // declared but undefined
50 DescriptorSet &operator =(const DescriptorSet &s); // declared, undefined
51
52 int *descriptors_; ///< descriptor values in random order
53 int *index_; ///< descriptor:position index into descriptors_
54 int capacity_; ///< total number of descriptor slots
55 int size_; ///< number of descriptors in the set
56};
57
58/// convenience wrapper to be used in debugs() context
59inline std::ostream &
60operator <<(std::ostream &os, const DescriptorSet &ds)
61{
62 ds.print(os);
63 return os;
64}
65
66#endif /* SQUID_DESCRIPTOR_SET_H */
67