Algorithms.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
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 
9 #ifndef SQUID_SRC_SBUF_ALGORITHMS_H
10 #define SQUID_SRC_SBUF_ALGORITHMS_H
11 
12 #include "sbuf/SBuf.h"
13 
14 #include <algorithm>
15 #include <numeric>
16 
18 class SBufEqual
19 {
20 public:
21  explicit SBufEqual(const SBuf &reference, SBufCaseSensitive sensitivity = caseSensitive) :
22  reference_(reference), sensitivity_(sensitivity) {}
23  bool operator() (const SBuf & checking) { return checking.compare(reference_,sensitivity_) == 0; }
24 private:
27 };
28 
31 {
32 public:
33  explicit SBufStartsWith(const SBuf &prefix, SBufCaseSensitive sensitivity = caseSensitive) :
34  prefix_(prefix), sensitivity_(sensitivity) {}
35  bool operator() (const SBuf & checking) { return checking.startsWith(prefix_,sensitivity_); }
36 private:
39 };
40 
46 {
47 public:
48  explicit SBufAddLength(const SBuf &separator) :
49  separatorLen_(separator.length()) {}
50  SBuf::size_type operator()(const SBuf::size_type sz, const SBuf & item) {
51  return sz + item.length() + separatorLen_;
52  }
53 private:
55 };
56 
66 template <class ContainerIterator>
67 SBuf&
68 JoinContainerIntoSBuf(SBuf &dest, const ContainerIterator &begin,
69  const ContainerIterator &end, const SBuf& separator,
70  const SBuf& prefix = SBuf(), const SBuf& suffix = SBuf())
71 {
72  if (begin == end) {
73  dest.append(prefix).append(suffix);
74  return dest;
75  }
76 
77  // optimization: pre-calculate needed storage
78  const SBuf::size_type totalContainerSize =
79  std::accumulate(begin, end, 0, SBufAddLength(separator)) +
80  dest.length() + prefix.length() + suffix.length();
82  req.minSpace = totalContainerSize;
83  dest.reserve(req);
84 
85  auto i = begin;
86  dest.append(prefix);
87  dest.append(*i);
88  ++i;
89  for (; i != end; ++i)
90  dest.append(separator).append(*i);
91  dest.append(suffix);
92  return dest;
93 }
94 
96 template <class ContainerIterator>
97 SBuf
98 JoinContainerToSBuf(const ContainerIterator &begin,
99  const ContainerIterator &end, const SBuf& separator,
100  const SBuf& prefix = SBuf(), const SBuf& suffix = SBuf())
101 {
102  SBuf rv;
103  return JoinContainerIntoSBuf(rv, begin, end, separator, prefix, suffix);
104 }
105 
106 namespace std {
108 template <>
109 struct hash<SBuf>
110 {
111  size_t operator()(const SBuf &) const noexcept;
112 };
113 }
114 
118 {
119 public:
120  std::size_t operator()(const SBuf &) const noexcept;
121 };
122 
126 {
127 public:
128  bool operator()(const SBuf &lhs, const SBuf &rhs) const
129  {
130  // Optimization: Do not iterate strings of different lengths.
131  return lhs.length() == rhs.length() && (lhs.compare(rhs, caseInsensitive) == 0);
132  }
133 };
134 
135 #endif /* SQUID_SRC_SBUF_ALGORITHMS_H */
136 
SBuf "starts with" predicate for STL algorithms etc.
Definition: Algorithms.h:30
SBuf::size_type separatorLen_
Definition: Algorithms.h:54
@ caseSensitive
Definition: SBuf.h:37
SBuf equality predicate for STL algorithms etc.
Definition: Algorithms.h:18
bool operator()(const SBuf &checking)
Definition: Algorithms.h:23
int compare(const SBuf &S, const SBufCaseSensitive isCaseSensitive, const size_type n) const
Definition: SBuf.cc:352
Definition: SBuf.h:93
Named SBuf::reserve() parameters. Defaults ask for and restrict nothing.
Definition: SBuf.h:700
SBuf & JoinContainerIntoSBuf(SBuf &dest, const ContainerIterator &begin, const ContainerIterator &end, const SBuf &separator, const SBuf &prefix=SBuf(), const SBuf &suffix=SBuf())
Definition: Algorithms.h:68
bool startsWith(const SBuf &S, const SBufCaseSensitive isCaseSensitive=caseSensitive) const
Definition: SBuf.cc:442
SBuf reference_
Definition: Algorithms.h:25
SBufCaseSensitive
Definition: SBuf.h:36
SBufEqual(const SBuf &reference, SBufCaseSensitive sensitivity=caseSensitive)
Definition: Algorithms.h:21
int const char size_t
Definition: stub_liblog.cc:83
size_type reserve(const SBufReservationRequirements &requirements)
Definition: SBuf.cc:112
std::size_t operator()(const SBuf &) const noexcept
Definition: Algorithms.cc:35
@ caseInsensitive
Definition: SBuf.h:38
SBufCaseSensitive sensitivity_
Definition: Algorithms.h:26
MemBlob::size_type size_type
Definition: SBuf.h:96
SBufCaseSensitive sensitivity_
Definition: Algorithms.h:38
bool operator()(const SBuf &checking)
Definition: Algorithms.h:35
static hash_table * hash
Definition: text_backend.cc:41
size_type length() const
Returns the number of bytes stored in SBuf.
Definition: SBuf.h:419
SBuf & append(const SBuf &S)
Definition: SBuf.cc:185
size_type minSpace
allocate [at least this much] if spaceSize() is smaller
Definition: SBuf.h:711
bool operator()(const SBuf &lhs, const SBuf &rhs) const
Definition: Algorithms.h:128
SBuf JoinContainerToSBuf(const ContainerIterator &begin, const ContainerIterator &end, const SBuf &separator, const SBuf &prefix=SBuf(), const SBuf &suffix=SBuf())
convenience wrapper of JoinContainerIntoSBuf with no caller-supplied SBuf
Definition: Algorithms.h:98
SBufStartsWith(const SBuf &prefix, SBufCaseSensitive sensitivity=caseSensitive)
Definition: Algorithms.h:33
SBufAddLength(const SBuf &separator)
Definition: Algorithms.h:48
SBuf::size_type operator()(const SBuf::size_type sz, const SBuf &item)
Definition: Algorithms.h:50

 

Introduction

Documentation

Support

Miscellaneous