Algorithms.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2017 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_SBUFALGOS_H_
10 #define SQUID_SBUFALGOS_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 
123 {
124 public:
125  std::size_t operator()(const SBuf &) const noexcept;
126 };
127 
128 #endif /* SQUID_SBUFALGOS_H_ */
129 
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
Definition: SBuf.h:87
SBuf::size_type operator()(const SBuf::size_type sz, const SBuf &item)
Definition: Algorithms.h:50
int i
Definition: membanger.c:49
SBuf & append(const SBuf &S)
Definition: SBuf.cc:207
SBuf reference_
Definition: Algorithms.h:25
SBufCaseSensitive
Definition: SBuf.h:37
Named SBuf::reserve() parameters. Defaults ask for and restrict nothing.
Definition: SBuf.h:687
size_type length() const
Returns the number of bytes stored in SBuf.
Definition: SBuf.h:405
static hash_table * hash
Definition: text_backend.cc:41
bool operator()(const SBuf &checking)
Definition: Algorithms.h:23
SBufCaseSensitive sensitivity_
Definition: Algorithms.h:38
int compare(const SBuf &S, const SBufCaseSensitive isCaseSensitive, const size_type n) const
Definition: SBuf.cc:382
SBuf equality predicate for STL algorithms etc.
Definition: Algorithms.h:18
size_type minSpace
allocate [at least this much] if spaceSize() is smaller
Definition: SBuf.h:698
SBufAddLength(const SBuf &separator)
Definition: Algorithms.h:48
SBufCaseSensitive sensitivity_
Definition: Algorithms.h:26
SBuf "starts with" predicate for STL algorithms etc.
Definition: Algorithms.h:30
bool startsWith(const SBuf &S, const SBufCaseSensitive isCaseSensitive=caseSensitive) const
Definition: SBuf.cc:472
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
int const char size_t
Definition: stub_liblog.cc:84
SBufEqual(const SBuf &reference, SBufCaseSensitive sensitivity=caseSensitive)
Definition: Algorithms.h:21
SBuf::size_type separatorLen_
Definition: Algorithms.h:54
bool operator()(const SBuf &checking)
Definition: Algorithms.h:35
MemBlob::size_type size_type
Definition: SBuf.h:90
size_type reserve(const SBufReservationRequirements &requirements)
Definition: SBuf.cc:123
std::size_t operator()(const SBuf &) const noexcept
Definition: Algorithms.cc:35
SBufStartsWith(const SBuf &prefix, SBufCaseSensitive sensitivity=caseSensitive)
Definition: Algorithms.h:33

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors