Coverage Report

Created: 2026-02-09 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmList.h
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
4
#pragma once
5
6
#include "cmConfigure.h" // IWYU pragma: keep
7
8
#include <algorithm>
9
#include <cstddef>
10
#include <initializer_list>
11
#include <iterator>
12
#include <memory>
13
#include <stdexcept>
14
#include <string>
15
#include <utility>
16
#include <vector>
17
18
#include <cm/string_view>
19
#include <cm/type_traits>
20
#include <cmext/iterator>
21
22
#include "cmValue.h"
23
24
template <typename T>
25
class BT;
26
class cmMakefile;
27
28
/**
29
 * CMake lists management
30
 * A CMake list is a string where list elements are separated by the ';'
31
 * character.
32
 *
33
 * For all operations, input arguments (single value like cm::string_view or
34
 * multiple values specified through pair of iterators) are, by default,
35
 * expanded. The expansion can be controlled by the cmList::ExpandElements
36
 * option.
37
 *
38
 * There ate some exceptions to this rule:
39
 *  * When the input argument is a cmList instance, the value is not expanded.
40
 *  * The following methods do not expand their argument: cmList::push_back,
41
 *    cmList::emplace and cmList::emplace_back.
42
 */
43
44
class cmList
45
{
46
public:
47
  using container_type = std::vector<std::string>;
48
49
  using value_type = container_type::value_type;
50
  using allocator_type = container_type::allocator_type;
51
  using index_type = std::ptrdiff_t;
52
  using size_type = container_type::size_type;
53
  using difference_type = container_type::difference_type;
54
  using reference = container_type::reference;
55
  using const_reference = container_type::const_reference;
56
  using iterator = container_type::iterator;
57
  using const_iterator = container_type::const_iterator;
58
  using reverse_iterator = container_type::reverse_iterator;
59
  using const_reverse_iterator = container_type::const_reverse_iterator;
60
61
  static size_type const npos = static_cast<size_type>(-1);
62
63
  static cm::string_view element_separator;
64
65
  enum class EmptyElements
66
  {
67
    No,
68
    Yes,
69
  };
70
  enum class ExpandElements
71
  {
72
    No,
73
    Yes,
74
  };
75
76
0
  cmList() = default;
77
  cmList(cmList const&) = default;
78
0
  cmList(cmList&&) = default;
79
80
  cmList(cm::string_view value,
81
         ExpandElements expandElements = ExpandElements::Yes,
82
         EmptyElements emptyElements = EmptyElements::No)
83
0
  {
84
0
    this->assign(value, expandElements, emptyElements);
85
0
  }
86
  cmList(cm::string_view value, EmptyElements emptyElements)
87
    : cmList(value, ExpandElements::Yes, emptyElements)
88
0
  {
89
0
  }
90
  cmList(std::string const& value,
91
         ExpandElements expandElements = ExpandElements::Yes,
92
         EmptyElements emptyElements = EmptyElements::No)
93
0
  {
94
0
    this->assign(value, expandElements, emptyElements);
95
0
  }
96
  cmList(std::string const& value, EmptyElements emptyElements)
97
0
    : cmList(value, ExpandElements::Yes, emptyElements)
98
0
  {
99
0
  }
100
  cmList(cmValue list, ExpandElements expandElements = ExpandElements::Yes,
101
         EmptyElements emptyElements = EmptyElements::No)
102
0
  {
103
0
    if (list) {
104
0
      this->assign(*list, expandElements, emptyElements);
105
0
    }
106
0
  }
107
  cmList(cmValue list, EmptyElements emptyElements)
108
0
    : cmList(list, ExpandElements::Yes, emptyElements)
109
0
  {
110
0
  }
111
  template <typename InputIterator>
112
  cmList(InputIterator first, InputIterator last,
113
         ExpandElements expandElements = ExpandElements::Yes,
114
         EmptyElements emptyElements = EmptyElements::No)
115
0
  {
116
0
    this->assign(first, last, expandElements, emptyElements);
117
0
  }
Unexecuted instantiation: cmList::cmList<std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: cmList::cmList<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: cmList::cmList<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, cmList::ExpandElements, cmList::EmptyElements)
118
  template <typename InputIterator>
119
  cmList(InputIterator first, InputIterator last, EmptyElements emptyElements)
120
    : cmList(first, last, ExpandElements::Yes, emptyElements)
121
  {
122
  }
123
  cmList(container_type const& init,
124
         ExpandElements expandElements = ExpandElements::Yes,
125
         EmptyElements emptyElements = EmptyElements::No)
126
0
    : cmList(init.begin(), init.end(), expandElements, emptyElements)
127
0
  {
128
0
  }
129
  cmList(container_type const& init, EmptyElements emptyElements)
130
    : cmList(init, ExpandElements::Yes, emptyElements)
131
0
  {
132
0
  }
133
  cmList(container_type&& init,
134
         ExpandElements expandElements = ExpandElements::Yes,
135
         EmptyElements emptyElements = EmptyElements::No)
136
0
    : cmList(std::make_move_iterator(init.begin()),
137
0
             std::make_move_iterator(init.end()), expandElements,
138
0
             emptyElements)
139
0
  {
140
0
    init.clear();
141
0
  }
142
  cmList(container_type&& init, EmptyElements emptyElements)
143
    : cmList(std::move(init), ExpandElements::Yes, emptyElements)
144
0
  {
145
0
  }
146
0
  cmList(std::initializer_list<std::string> init) { this->assign(init); }
147
148
0
  ~cmList() = default;
149
150
  cmList& operator=(cmList const&) = default;
151
0
  cmList& operator=(cmList&&) = default;
152
153
  cmList& operator=(cm::string_view value)
154
0
  {
155
0
    this->assign(value);
156
0
    return *this;
157
0
  }
158
  cmList& operator=(std::string const& value)
159
0
  {
160
0
    this->assign(value);
161
0
    return *this;
162
0
  }
163
  cmList& operator=(cmValue value)
164
0
  {
165
0
    if (value) {
166
0
      this->operator=(*value);
167
0
    } else {
168
0
      this->clear();
169
0
    }
170
171
0
    return *this;
172
0
  }
173
174
  cmList& operator=(container_type const& init)
175
0
  {
176
0
    this->assign(init);
177
0
    return *this;
178
0
  }
179
  cmList& operator=(container_type&& init)
180
0
  {
181
0
    this->assign(std::move(init));
182
183
0
    return *this;
184
0
  }
185
186
  cmList& operator=(std::initializer_list<std::string> init)
187
0
  {
188
0
    this->assign(init);
189
0
    return *this;
190
0
  }
191
192
  void assign(cm::string_view value,
193
              ExpandElements expandElements = ExpandElements::Yes,
194
              EmptyElements emptyElements = EmptyElements::No)
195
0
  {
196
0
    this->clear();
197
0
    this->append(value, expandElements, emptyElements);
198
0
  }
199
  void assign(cm::string_view value, EmptyElements emptyElements)
200
0
  {
201
0
    this->assign(value, ExpandElements::Yes, emptyElements);
202
0
  }
203
  void assign(std::string const& value,
204
              ExpandElements expandElements = ExpandElements::Yes,
205
              EmptyElements emptyElements = EmptyElements::No)
206
0
  {
207
0
    this->clear();
208
0
    this->append(value, expandElements, emptyElements);
209
0
  }
210
  void assign(std::string const& value, EmptyElements emptyElements)
211
0
  {
212
0
    this->assign(value, ExpandElements::Yes, emptyElements);
213
0
  }
214
  void assign(cmValue value,
215
              ExpandElements expandElements = ExpandElements::Yes,
216
              EmptyElements emptyElements = EmptyElements::No)
217
0
  {
218
0
    if (value) {
219
0
      this->assign(*value, expandElements, emptyElements);
220
0
    } else {
221
0
      this->clear();
222
0
    }
223
0
  }
224
  void assign(cmValue value, EmptyElements emptyElements)
225
0
  {
226
0
    this->assign(value, ExpandElements::Yes, emptyElements);
227
0
  }
228
  template <typename InputIterator>
229
  void assign(InputIterator first, InputIterator last,
230
              ExpandElements expandElements = ExpandElements::Yes,
231
              EmptyElements emptyElements = EmptyElements::No)
232
0
  {
233
0
    this->clear();
234
0
    this->append(first, last, expandElements, emptyElements);
235
0
  }
Unexecuted instantiation: void cmList::assign<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: void cmList::assign<std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: void cmList::assign<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: void cmList::assign<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, cmList::ExpandElements, cmList::EmptyElements)
236
  template <typename InputIterator>
237
  void assign(InputIterator first, InputIterator last,
238
              EmptyElements emptyElements)
239
  {
240
    this->assign(first, last, ExpandElements::Yes, emptyElements);
241
  }
242
  void assign(cmList const& init,
243
              ExpandElements expandElements = ExpandElements::No,
244
              EmptyElements emptyElements = EmptyElements::No)
245
0
  {
246
0
    this->assign(init.begin(), init.end(), expandElements, emptyElements);
247
0
  }
248
  void assign(cmList const& init, EmptyElements emptyElements)
249
0
  {
250
0
    this->assign(init, ExpandElements::No, emptyElements);
251
0
  }
252
  void assign(cmList&& init,
253
              ExpandElements expandElements = ExpandElements::No,
254
              EmptyElements emptyElements = EmptyElements::No)
255
0
  {
256
0
    this->assign(std::make_move_iterator(init.begin()),
257
0
                 std::make_move_iterator(init.end()), expandElements,
258
0
                 emptyElements);
259
0
    init.clear();
260
0
  }
261
  void assign(cmList&& init, EmptyElements emptyElements)
262
0
  {
263
0
    this->assign(std::move(init), ExpandElements::No, emptyElements);
264
0
  }
265
  void assign(container_type const& init,
266
              ExpandElements expandElements = ExpandElements::Yes,
267
              EmptyElements emptyElements = EmptyElements::No)
268
0
  {
269
0
    this->assign(init.begin(), init.end(), expandElements, emptyElements);
270
0
  }
271
  void assign(container_type const& init, EmptyElements emptyElements)
272
0
  {
273
0
    this->assign(init, ExpandElements::Yes, emptyElements);
274
0
  }
275
  void assign(container_type&& init,
276
              ExpandElements expandElements = ExpandElements::Yes,
277
              EmptyElements emptyElements = EmptyElements::No)
278
0
  {
279
0
    this->assign(std::make_move_iterator(init.begin()),
280
0
                 std::make_move_iterator(init.end()), expandElements,
281
0
                 emptyElements);
282
0
    init.clear();
283
0
  }
284
  void assign(container_type&& init, EmptyElements emptyElements)
285
0
  {
286
0
    this->assign(std::move(init), ExpandElements::Yes, emptyElements);
287
0
  }
288
  void assign(std::initializer_list<std::string> init)
289
0
  {
290
0
    this->assign(init.begin(), init.end());
291
0
  }
292
293
  // Conversions
294
  std::string to_string() const
295
0
  {
296
0
    return this->join(cmList::element_separator);
297
0
  }
298
299
0
  operator container_type&() & noexcept { return this->Values; }
300
0
  operator container_type const&() const& noexcept { return this->Values; }
301
0
  operator container_type&&() && noexcept { return std::move(this->Values); }
302
303
  // Element access
304
0
  reference at(size_type pos) { return this->Values.at(pos); }
305
0
  const_reference at(size_type pos) const { return this->Values.at(pos); }
306
307
0
  reference operator[](size_type pos) { return this->Values[pos]; }
308
0
  const_reference operator[](size_type pos) const { return this->Values[pos]; }
309
310
  reference get_item(index_type pos)
311
0
  {
312
0
    return this->Values.at(this->ComputeIndex(pos));
313
0
  }
314
  const_reference get_item(index_type pos) const
315
0
  {
316
0
    return this->Values.at(this->ComputeIndex(pos));
317
0
  }
318
319
0
  reference front() { return this->Values.front(); }
320
0
  const_reference front() const { return this->Values.front(); }
321
322
0
  reference back() { return this->Values.back(); }
323
0
  const_reference back() const { return this->Values.back(); }
324
325
  // extract sublist in range [first, last)
326
  cmList sublist(const_iterator first, const_iterator last) const
327
0
  {
328
0
    return cmList{ first, last, ExpandElements::No, EmptyElements::Yes };
329
0
  }
330
  // Extract sublist in range [first, last)
331
  // Throw std::out_of_range if pos is invalid
332
  cmList sublist(size_type pos = 0, size_type length = npos) const;
333
334
  // Returns the list of elements
335
  // Throw std::out_of_range if any index is invalid
336
  cmList get_items(std::initializer_list<index_type> indexes) const
337
0
  {
338
0
    return this->GetItems(
339
0
      std::vector<index_type>{ indexes.begin(), indexes.end() });
340
0
  }
341
  template <typename InputIterator>
342
  cmList get_items(InputIterator first, InputIterator last) const
343
0
  {
344
0
    return this->GetItems(std::vector<index_type>{ first, last });
345
0
  }
Unexecuted instantiation: cmList cmList::get_items<std::__1::__wrap_iter<int*> >(std::__1::__wrap_iter<int*>, std::__1::__wrap_iter<int*>) const
Unexecuted instantiation: cmList cmList::get_items<std::__1::__wrap_iter<long*> >(std::__1::__wrap_iter<long*>, std::__1::__wrap_iter<long*>) const
346
347
  size_type find(cm::string_view value) const;
348
  size_type find(cmValue value) const
349
0
  {
350
0
    if (value) {
351
0
      return this->find(*value);
352
0
    }
353
0
354
0
    return npos;
355
0
  }
356
357
0
  container_type& data() noexcept { return this->Values; }
358
0
  container_type const& data() const noexcept { return this->Values; }
359
360
  // Iterators
361
0
  iterator begin() noexcept { return this->Values.begin(); }
362
0
  const_iterator begin() const noexcept { return this->Values.begin(); }
363
0
  const_iterator cbegin() const noexcept { return this->Values.cbegin(); }
364
365
0
  iterator end() noexcept { return this->Values.end(); }
366
0
  const_iterator end() const noexcept { return this->Values.end(); }
367
0
  const_iterator cend() const noexcept { return this->Values.cend(); }
368
369
0
  reverse_iterator rbegin() noexcept { return this->Values.rbegin(); }
370
  const_reverse_iterator rbegin() const noexcept
371
0
  {
372
0
    return this->Values.rbegin();
373
0
  }
374
  const_reverse_iterator crbegin() const noexcept
375
0
  {
376
0
    return this->Values.crbegin();
377
0
  }
378
379
0
  reverse_iterator rend() noexcept { return this->Values.rend(); }
380
0
  const_reverse_iterator rend() const noexcept { return this->Values.rend(); }
381
  const_reverse_iterator crend() const noexcept
382
0
  {
383
0
    return this->Values.crend();
384
0
  }
385
386
  // Capacity
387
0
  bool empty() const noexcept { return this->Values.empty(); }
388
0
  size_type size() const noexcept { return this->Values.size(); }
389
390
  // Modifiers
391
0
  void clear() noexcept { this->Values.clear(); }
392
393
  iterator insert(const_iterator pos, cm::string_view value,
394
                  ExpandElements expandElements = ExpandElements::Yes,
395
                  EmptyElements emptyElements = EmptyElements::No)
396
0
  {
397
0
    return cmList::Insert(this->Values, pos, std::string(value),
398
0
                          expandElements, emptyElements);
399
0
  }
400
  iterator insert(const_iterator pos, cm::string_view value,
401
                  EmptyElements emptyElements)
402
0
  {
403
0
    return this->insert(pos, value, ExpandElements::Yes, emptyElements);
404
0
  }
405
  iterator insert(const_iterator pos, std::string const& value,
406
                  ExpandElements expandElements = ExpandElements::Yes,
407
                  EmptyElements emptyElements = EmptyElements::No)
408
0
  {
409
0
    return cmList::Insert(this->Values, pos, value, expandElements,
410
0
                          emptyElements);
411
0
  }
412
  iterator insert(const_iterator pos, std::string const& value,
413
                  EmptyElements emptyElements)
414
0
  {
415
0
    return this->insert(pos, value, ExpandElements::Yes, emptyElements);
416
0
  }
417
  iterator insert(const_iterator pos, cmValue value,
418
                  ExpandElements expandElements = ExpandElements::Yes,
419
                  EmptyElements emptyElements = EmptyElements::No)
420
0
  {
421
0
    if (value) {
422
0
      return this->insert(pos, *value, expandElements, emptyElements);
423
0
    }
424
0
425
0
    auto delta = std::distance(this->cbegin(), pos);
426
0
    return this->begin() + delta;
427
0
  }
428
  iterator insert(const_iterator pos, cmValue value,
429
                  EmptyElements emptyElements)
430
0
  {
431
0
    return this->insert(pos, value, ExpandElements::Yes, emptyElements);
432
0
  }
433
  template <typename InputIterator>
434
  iterator insert(const_iterator pos, InputIterator first, InputIterator last,
435
                  ExpandElements expandElements = ExpandElements::Yes,
436
                  EmptyElements emptyElements = EmptyElements::No)
437
0
  {
438
0
    return cmList::Insert(this->Values, pos, first, last, expandElements,
439
0
                          emptyElements);
440
0
  }
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::insert<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::insert<std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::insert<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::insert<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, cmList::ExpandElements, cmList::EmptyElements)
441
  template <typename InputIterator>
442
  iterator insert(const_iterator pos, InputIterator first, InputIterator last,
443
                  EmptyElements emptyElements)
444
  {
445
    return this->insert(pos, first, last, ExpandElements::Yes, emptyElements);
446
  }
447
  iterator insert(const_iterator pos, cmList const& values,
448
                  ExpandElements expandElements = ExpandElements::No,
449
                  EmptyElements emptyElements = EmptyElements::No)
450
0
  {
451
0
    return this->insert(pos, values.begin(), values.end(), expandElements,
452
0
                        emptyElements);
453
0
  }
454
  iterator insert(const_iterator pos, cmList const& values,
455
                  EmptyElements emptyElements)
456
0
  {
457
0
    return this->insert(pos, values, ExpandElements::No, emptyElements);
458
0
  }
459
  iterator insert(const_iterator pos, cmList&& values,
460
                  ExpandElements expandElements = ExpandElements::No,
461
                  EmptyElements emptyElements = EmptyElements::No)
462
0
  {
463
0
    auto result = this->insert(pos, std::make_move_iterator(values.begin()),
464
0
                               std::make_move_iterator(values.end()),
465
0
                               expandElements, emptyElements);
466
0
    values.clear();
467
0
468
0
    return result;
469
0
  }
470
  iterator insert(const_iterator pos, cmList&& values,
471
                  EmptyElements emptyElements)
472
0
  {
473
0
    return this->insert(pos, std::move(values), ExpandElements::No,
474
0
                        emptyElements);
475
0
  }
476
  iterator insert(const_iterator pos, container_type const& values,
477
                  ExpandElements expandElements = ExpandElements::Yes,
478
                  EmptyElements emptyElements = EmptyElements::No)
479
0
  {
480
0
    return this->insert(pos, values.begin(), values.end(), expandElements,
481
0
                        emptyElements);
482
0
  }
483
  iterator insert(const_iterator pos, container_type const& values,
484
                  EmptyElements emptyElements)
485
0
  {
486
0
    return this->insert(pos, values, ExpandElements::Yes, emptyElements);
487
0
  }
488
  iterator insert(const_iterator pos, container_type&& values,
489
                  ExpandElements expandElements = ExpandElements::Yes,
490
                  EmptyElements emptyElements = EmptyElements::No)
491
0
  {
492
0
    auto result = this->insert(pos, std::make_move_iterator(values.begin()),
493
0
                               std::make_move_iterator(values.end()),
494
0
                               expandElements, emptyElements);
495
0
    values.clear();
496
0
497
0
    return result;
498
0
  }
499
  iterator insert(const_iterator pos, container_type&& values,
500
                  EmptyElements emptyElements)
501
0
  {
502
0
    return this->insert(pos, std::move(values), ExpandElements::Yes,
503
0
                        emptyElements);
504
0
  }
505
  iterator insert(const_iterator pos, std::initializer_list<std::string> ilist)
506
0
  {
507
0
    return this->insert(pos, ilist.begin(), ilist.end());
508
0
  }
509
510
  iterator append(cm::string_view value,
511
                  ExpandElements expandElements = ExpandElements::Yes,
512
                  EmptyElements emptyElements = EmptyElements::No)
513
0
  {
514
0
    return this->insert(this->cend(), value, expandElements, emptyElements);
515
0
  }
516
  iterator append(cm::string_view value, EmptyElements emptyElements)
517
0
  {
518
0
    return this->append(value, ExpandElements::Yes, emptyElements);
519
0
  }
520
  iterator append(std::string const& value,
521
                  ExpandElements expandElements = ExpandElements::Yes,
522
                  EmptyElements emptyElements = EmptyElements::No)
523
0
  {
524
0
    return this->insert(this->cend(), value, expandElements, emptyElements);
525
0
  }
526
  iterator append(std::string const& value, EmptyElements emptyElements)
527
0
  {
528
0
    return this->append(value, ExpandElements::Yes, emptyElements);
529
0
  }
530
  iterator append(cmValue value,
531
                  ExpandElements expandElements = ExpandElements::Yes,
532
                  EmptyElements emptyElements = EmptyElements::No)
533
0
  {
534
0
    if (value) {
535
0
      return this->append(*value, expandElements, emptyElements);
536
0
    }
537
538
0
    return this->end();
539
0
  }
540
  iterator append(cmValue value, EmptyElements emptyElements)
541
0
  {
542
0
    return this->append(value, ExpandElements::Yes, emptyElements);
543
0
  }
544
  template <typename InputIterator>
545
  iterator append(InputIterator first, InputIterator last,
546
                  ExpandElements expandElements = ExpandElements::Yes,
547
                  EmptyElements emptyElements = EmptyElements::No)
548
0
  {
549
0
    return this->insert(this->cend(), first, last, expandElements,
550
0
                        emptyElements);
551
0
  }
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::append<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::append<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::append<std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::append<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, cmList::ExpandElements, cmList::EmptyElements)
552
  template <typename InputIterator>
553
  iterator append(InputIterator first, InputIterator last,
554
                  EmptyElements emptyElements)
555
  {
556
    return this->append(first, last, ExpandElements::Yes, emptyElements);
557
  }
558
  iterator append(cmList const& values,
559
                  ExpandElements expandElements = ExpandElements::No,
560
                  EmptyElements emptyElements = EmptyElements::No)
561
0
  {
562
0
    return this->append(values.begin(), values.end(), expandElements,
563
0
                        emptyElements);
564
0
  }
565
  iterator append(cmList const& values, EmptyElements emptyElements)
566
0
  {
567
0
    return this->append(values, ExpandElements::No, emptyElements);
568
0
  }
569
  iterator append(cmList&& values,
570
                  ExpandElements expandElements = ExpandElements::No,
571
                  EmptyElements emptyElements = EmptyElements::No)
572
0
  {
573
0
    auto result = this->append(std::make_move_iterator(values.begin()),
574
0
                               std::make_move_iterator(values.end()),
575
0
                               expandElements, emptyElements);
576
0
    values.clear();
577
0
578
0
    return result;
579
0
  }
580
  iterator append(cmList&& values, EmptyElements emptyElements)
581
0
  {
582
0
    return this->append(std::move(values), ExpandElements::No, emptyElements);
583
0
  }
584
  iterator append(container_type const& values,
585
                  ExpandElements expandElements = ExpandElements::Yes,
586
                  EmptyElements emptyElements = EmptyElements::No)
587
0
  {
588
0
    return this->append(values.begin(), values.end(), expandElements,
589
0
                        emptyElements);
590
0
  }
591
  iterator append(container_type const& values, EmptyElements emptyElements)
592
0
  {
593
0
    return this->append(values, ExpandElements::Yes, emptyElements);
594
0
  }
595
  iterator append(container_type&& values,
596
                  ExpandElements expandElements = ExpandElements::Yes,
597
                  EmptyElements emptyElements = EmptyElements::No)
598
0
  {
599
0
    auto result = this->append(std::make_move_iterator(values.begin()),
600
0
                               std::make_move_iterator(values.end()),
601
0
                               expandElements, emptyElements);
602
0
    values.clear();
603
0
604
0
    return result;
605
0
  }
606
  iterator append(container_type&& values, EmptyElements emptyElements)
607
0
  {
608
0
    return this->append(std::move(values), ExpandElements::Yes, emptyElements);
609
0
  }
610
  iterator append(std::initializer_list<std::string> ilist)
611
0
  {
612
0
    return this->insert(this->cend(), ilist);
613
0
  }
614
615
  iterator prepend(cm::string_view value,
616
                   ExpandElements expandElements = ExpandElements::Yes,
617
                   EmptyElements emptyElements = EmptyElements::No)
618
0
  {
619
0
    return this->insert(this->cbegin(), value, expandElements, emptyElements);
620
0
  }
621
  iterator prepend(cm::string_view value, EmptyElements emptyElements)
622
0
  {
623
0
    return this->prepend(value, ExpandElements::Yes, emptyElements);
624
0
  }
625
  iterator prepend(std::string const& value,
626
                   ExpandElements expandElements = ExpandElements::Yes,
627
                   EmptyElements emptyElements = EmptyElements::No)
628
0
  {
629
0
    return this->insert(this->cbegin(), value, expandElements, emptyElements);
630
0
  }
631
  iterator prepend(std::string const& value, EmptyElements emptyElements)
632
0
  {
633
0
    return this->prepend(value, ExpandElements::Yes, emptyElements);
634
0
  }
635
  iterator prepend(cmValue value,
636
                   ExpandElements expandElements = ExpandElements::Yes,
637
                   EmptyElements emptyElements = EmptyElements::No)
638
0
  {
639
0
    if (value) {
640
0
      return this->prepend(*value, expandElements, emptyElements);
641
0
    }
642
0
643
0
    return this->begin();
644
0
  }
645
  iterator prepend(cmValue value, EmptyElements emptyElements)
646
0
  {
647
0
    return this->prepend(value, ExpandElements::Yes, emptyElements);
648
0
  }
649
  template <typename InputIterator>
650
  iterator prepend(InputIterator first, InputIterator last,
651
                   ExpandElements expandElements = ExpandElements::Yes,
652
                   EmptyElements emptyElements = EmptyElements::No)
653
0
  {
654
0
    return this->insert(this->cbegin(), first, last, expandElements,
655
0
                        emptyElements);
656
0
  }
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::prepend<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::prepend<std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, cmList::ExpandElements, cmList::EmptyElements)
657
  template <typename InputIterator>
658
  iterator prepend(InputIterator first, InputIterator last,
659
                   EmptyElements emptyElements)
660
  {
661
    return this->prepend(first, last, ExpandElements::Yes, emptyElements);
662
  }
663
  iterator prepend(cmList const& values,
664
                   ExpandElements expandElements = ExpandElements::No,
665
                   EmptyElements emptyElements = EmptyElements::No)
666
0
  {
667
0
    return this->prepend(values.begin(), values.end(), expandElements,
668
0
                         emptyElements);
669
0
  }
670
  iterator prepend(cmList const& values, EmptyElements emptyElements)
671
0
  {
672
0
    return this->prepend(values, ExpandElements::No, emptyElements);
673
0
  }
674
  iterator prepend(cmList&& values,
675
                   ExpandElements expandElements = ExpandElements::No,
676
                   EmptyElements emptyElements = EmptyElements::No)
677
0
  {
678
0
    auto result = this->prepend(std::make_move_iterator(values.begin()),
679
0
                                std::make_move_iterator(values.end()),
680
0
                                expandElements, emptyElements);
681
0
    values.clear();
682
0
683
0
    return result;
684
0
  }
685
  iterator prepend(cmList&& values, EmptyElements emptyElements)
686
0
  {
687
0
    return this->prepend(std::move(values), ExpandElements::No, emptyElements);
688
0
  }
689
  iterator prepend(container_type const& values,
690
                   ExpandElements expandElements = ExpandElements::Yes,
691
                   EmptyElements emptyElements = EmptyElements::No)
692
0
  {
693
0
    return this->prepend(values.begin(), values.end(), expandElements,
694
0
                         emptyElements);
695
0
  }
696
  iterator prepend(container_type const& values, EmptyElements emptyElements)
697
0
  {
698
0
    return this->prepend(values, ExpandElements::Yes, emptyElements);
699
0
  }
700
  iterator prepend(container_type&& values,
701
                   ExpandElements expandElements = ExpandElements::Yes,
702
                   EmptyElements emptyElements = EmptyElements::No)
703
0
  {
704
0
    auto result = this->prepend(std::make_move_iterator(values.begin()),
705
0
                                std::make_move_iterator(values.end()),
706
0
                                expandElements, emptyElements);
707
0
    values.clear();
708
0
709
0
    return result;
710
0
  }
711
  iterator prepend(container_type&& values, EmptyElements emptyElements)
712
0
  {
713
0
    return this->prepend(std::move(values), ExpandElements::Yes,
714
0
                         emptyElements);
715
0
  }
716
  iterator prepend(std::initializer_list<std::string> ilist)
717
0
  {
718
0
    return this->insert(this->cbegin(), ilist);
719
0
  }
720
721
0
  void push_back(std::string const& value) { this->Values.push_back(value); }
722
  void push_back(cm::string_view value)
723
0
  {
724
0
    this->Values.push_back(std::string{ value });
725
0
  }
726
  void push_back(std::string&& value)
727
0
  {
728
0
    this->Values.push_back(std::move(value));
729
0
  }
730
731
  template <typename... Args>
732
  iterator emplace(const_iterator pos, Args&&... args)
733
  {
734
    return this->Values.emplace(pos, std::forward<Args>(args)...);
735
  }
736
737
  template <typename... Args>
738
  void emplace_back(Args&&... args)
739
0
  {
740
0
    this->Values.emplace_back(std::forward<Args>(args)...);
741
0
  }
Unexecuted instantiation: void cmList::emplace_back<char const (&) [6]>(char const (&) [6])
Unexecuted instantiation: void cmList::emplace_back<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: void cmList::emplace_back<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&)
Unexecuted instantiation: void cmList::emplace_back<>()
Unexecuted instantiation: void cmList::emplace_back<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
Unexecuted instantiation: void cmList::emplace_back<char const (&) [3]>(char const (&) [3])
742
743
  // Inserts elements in the list
744
  // Throw std::out_of_range if index is invalid
745
  template <typename InputIterator>
746
  cmList& insert_items(index_type index, InputIterator first,
747
                       InputIterator last,
748
                       ExpandElements expandElements = ExpandElements::Yes,
749
                       EmptyElements emptyElements = EmptyElements::No)
750
0
  {
751
0
    auto const offset =
752
0
      static_cast<difference_type>(this->ComputeInsertIndex(index));
753
0
    this->insert(this->begin() + offset, first, last, expandElements,
754
0
                 emptyElements);
755
0
    return *this;
756
0
  }
Unexecuted instantiation: cmList& cmList::insert_items<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: cmList& cmList::insert_items<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(long, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
757
  template <typename InputIterator>
758
  cmList& insert_items(index_type index, InputIterator first,
759
                       InputIterator last, EmptyElements emptyElements)
760
  {
761
    this->insert(this->begin() + this->ComputeInsertIndex(index), first, last,
762
                 ExpandElements::Yes, emptyElements);
763
    return *this;
764
  }
765
  cmList& insert_items(index_type index,
766
                       std::initializer_list<std::string> values)
767
0
  {
768
0
    return this->insert_items(index, values.begin(), values.end());
769
0
  }
770
771
  iterator erase(const_iterator pos)
772
0
  {
773
    // convert const_iterator in iterator to please non standard c++11
774
    // compilers (gcc 4.8 for example)
775
0
    auto pos2 =
776
0
      this->Values.begin() + std::distance(this->Values.cbegin(), pos);
777
0
    return this->Values.erase(pos2);
778
0
  }
779
  iterator erase(const_iterator first, const_iterator last)
780
0
  {
781
    // convert const_iterator in iterator to please non standard c++11
782
    // compilers (gcc 4.8 for example)
783
0
    auto first2 =
784
0
      this->Values.begin() + std::distance(this->Values.cbegin(), first);
785
0
    auto last2 =
786
0
      this->Values.begin() + std::distance(this->Values.cbegin(), last);
787
0
    return this->Values.erase(first2, last2);
788
0
  }
789
790
0
  void pop_back() { this->Values.pop_back(); }
791
0
  void pop_front() { this->Values.erase(this->begin()); }
792
793
  // Removes elements from the list
794
  // Throw std::out_of_range if any index is invalid
795
  cmList& remove_items(std::initializer_list<index_type> indexes)
796
0
  {
797
0
    return this->RemoveItems(
798
0
      std::vector<index_type>{ indexes.begin(), indexes.end() });
799
0
  }
800
  cmList& remove_items(std::initializer_list<std::string> values)
801
0
  {
802
0
    return this->RemoveItems(
803
0
      std::vector<std::string>{ values.begin(), values.end() });
804
0
  }
805
  template <typename InputIterator>
806
  cmList& remove_items(InputIterator first, InputIterator last)
807
0
  {
808
0
    return this->RemoveItems(
809
0
      std::vector<typename InputIterator::value_type>{ first, last });
810
0
  }
Unexecuted instantiation: cmList& cmList::remove_items<std::__1::__wrap_iter<long*> >(std::__1::__wrap_iter<long*>, std::__1::__wrap_iter<long*>)
Unexecuted instantiation: cmList& cmList::remove_items<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>)
Unexecuted instantiation: cmList& cmList::remove_items<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>)
811
812
  cmList& remove_duplicates();
813
814
0
  void resize(size_type count) { this->Values.resize(count); }
815
816
0
  void reserve(size_type count) { this->Values.reserve(count); }
817
818
  enum class FilterMode
819
  {
820
    INCLUDE,
821
    EXCLUDE
822
  };
823
  // Includes or removes items from the list
824
  // Throw std::invalid_argument if regular expression is invalid
825
  cmList& filter(cm::string_view regex, FilterMode mode);
826
827
  cmList& reverse()
828
0
  {
829
0
    std::reverse(this->Values.begin(), this->Values.end());
830
0
    return *this;
831
0
  }
832
833
  struct SortConfiguration
834
  {
835
    enum class OrderMode
836
    {
837
      DEFAULT,
838
      ASCENDING,
839
      DESCENDING,
840
    } Order = OrderMode::DEFAULT;
841
842
    enum class CompareMethod
843
    {
844
      DEFAULT,
845
      STRING,
846
      FILE_BASENAME,
847
      NATURAL,
848
    } Compare = CompareMethod::DEFAULT;
849
850
    enum class CaseSensitivity
851
    {
852
      DEFAULT,
853
      SENSITIVE,
854
      INSENSITIVE,
855
    } Case = CaseSensitivity::DEFAULT;
856
857
    // declare the default constructor to work-around clang bug
858
    SortConfiguration();
859
860
    SortConfiguration(OrderMode order, CompareMethod compare,
861
                      CaseSensitivity caseSensitivity)
862
      : Order(order)
863
      , Compare(compare)
864
      , Case(caseSensitivity)
865
0
    {
866
0
    }
867
  };
868
  cmList& sort(SortConfiguration config = SortConfiguration{});
869
870
  // exception raised on error during transform operations
871
  class transform_error : public std::runtime_error
872
  {
873
  public:
874
    transform_error(std::string const& error)
875
0
      : std::runtime_error(error)
876
0
    {
877
0
    }
878
  };
879
880
  class TransformSelector
881
  {
882
  public:
883
    using index_type = cmList::index_type;
884
885
    // define some structs used as template selector
886
    struct AT;
887
    struct FOR;
888
    struct REGEX;
889
890
0
    virtual ~TransformSelector() = default;
891
892
    virtual std::string const& GetTag() = 0;
893
894
    // method NEW is used to allocate a selector of the needed type.
895
    // For example:
896
    // cmList::TransformSelector::New<AT>({1, 2, 5, 6});
897
    //  or
898
    // cmList::TransformSelector::New<REGEX>("^XX.*");
899
    static std::unique_ptr<TransformSelector> New();
900
    template <typename Type>
901
    static std::unique_ptr<TransformSelector> New(
902
      std::initializer_list<index_type>);
903
    template <typename Type>
904
    static std::unique_ptr<TransformSelector> New(
905
      std::vector<index_type> const&);
906
    template <typename Type>
907
    static std::unique_ptr<TransformSelector> New(std::vector<index_type>&&);
908
909
    template <typename Type>
910
    static std::unique_ptr<TransformSelector> New(std::string const&);
911
    template <typename Type>
912
    static std::unique_ptr<TransformSelector> New(std::string&&);
913
914
    cmMakefile* Makefile = nullptr;
915
916
  private:
917
    static std::unique_ptr<TransformSelector> NewAT(
918
      std::initializer_list<index_type> init);
919
    static std::unique_ptr<TransformSelector> NewAT(
920
      std::vector<index_type> const& init);
921
    static std::unique_ptr<TransformSelector> NewAT(
922
      std::vector<index_type>&& init);
923
924
    static std::unique_ptr<TransformSelector> NewFOR(
925
      std::initializer_list<index_type> init);
926
    static std::unique_ptr<TransformSelector> NewFOR(
927
      std::vector<index_type> const& init);
928
    static std::unique_ptr<TransformSelector> NewFOR(
929
      std::vector<index_type>&& init);
930
931
    static std::unique_ptr<TransformSelector> NewREGEX(
932
      std::string const& init);
933
    static std::unique_ptr<TransformSelector> NewREGEX(std::string&& init);
934
  };
935
936
  enum class TransformAction
937
  {
938
    APPEND,
939
    PREPEND,
940
    TOLOWER,
941
    TOUPPER,
942
    STRIP,
943
    GENEX_STRIP,
944
    REPLACE
945
  };
946
947
  // Transforms the list by applying an action
948
  // Throw std::transform_error is any of arguments specified are invalid
949
  cmList& transform(TransformAction action,
950
                    std::unique_ptr<TransformSelector> = {});
951
  cmList& transform(TransformAction action, std::string const& arg,
952
                    std::unique_ptr<TransformSelector> = {});
953
  cmList& transform(TransformAction action, std::string const& arg1,
954
                    std::string const& arg2,
955
                    std::unique_ptr<TransformSelector> = {});
956
  cmList& transform(TransformAction action,
957
                    std::vector<std::string> const& args,
958
                    std::unique_ptr<TransformSelector> = {});
959
960
  std::string join(cm::string_view glue) const
961
0
  {
962
0
    return cmList::Join(this->Values, glue);
963
0
  }
964
965
0
  void swap(cmList& other) noexcept { this->Values.swap(other.Values); }
966
967
  // static members
968
  // ==============
969
  // these methods can be used to store CMake list expansion directly in a
970
  // std::vector.
971
  static void assign(std::vector<std::string>& container,
972
                     cm::string_view value,
973
                     EmptyElements emptyElements = EmptyElements::No)
974
0
  {
975
0
    container.clear();
976
0
    cmList::append(container, value, emptyElements);
977
0
  }
978
  static void assign(std::vector<std::string>& container,
979
                     std::string const& value,
980
                     EmptyElements emptyElements = EmptyElements::No)
981
0
  {
982
0
    container.clear();
983
0
    cmList::append(container, value, emptyElements);
984
0
  }
985
  static void assign(std::vector<std::string>& container, cmValue value,
986
                     EmptyElements emptyElements = EmptyElements::No)
987
0
  {
988
0
    if (value) {
989
0
      cmList::assign(container, *value, emptyElements);
990
0
    } else {
991
0
      container.clear();
992
0
    }
993
0
  }
994
  template <typename InputIterator>
995
  static void assign(std::vector<std::string>& container, InputIterator first,
996
                     InputIterator last,
997
                     EmptyElements emptyElements = EmptyElements::No)
998
  {
999
    container.clear();
1000
    cmList::append(container, first, last, emptyElements);
1001
  }
1002
1003
  static std::vector<std::string>::iterator insert(
1004
    std::vector<std::string>& container,
1005
    std::vector<std::string>::const_iterator pos, cm::string_view value,
1006
    EmptyElements emptyElements = EmptyElements::No)
1007
13.4k
  {
1008
13.4k
    return cmList::Insert(container, pos, std::string(value),
1009
13.4k
                          ExpandElements::Yes, emptyElements);
1010
13.4k
  }
1011
  static std::vector<std::string>::iterator insert(
1012
    std::vector<std::string>& container,
1013
    std::vector<std::string>::const_iterator pos, std::string const& value,
1014
    EmptyElements emptyElements = EmptyElements::No)
1015
0
  {
1016
0
    return cmList::Insert(container, pos, value, ExpandElements::Yes,
1017
0
                          emptyElements);
1018
0
  }
1019
  static std::vector<std::string>::iterator insert(
1020
    std::vector<std::string>& container,
1021
    std::vector<std::string>::const_iterator pos, cmValue value,
1022
    EmptyElements emptyElements = EmptyElements::No)
1023
0
  {
1024
0
    if (value) {
1025
0
      return cmList::insert(container, pos, *value, emptyElements);
1026
0
    }
1027
0
1028
0
    auto delta = std::distance(container.cbegin(), pos);
1029
0
    return container.begin() + delta;
1030
0
  }
1031
  template <typename InputIterator>
1032
  static std::vector<std::string>::iterator insert(
1033
    std::vector<std::string>& container,
1034
    std::vector<std::string>::const_iterator pos, InputIterator first,
1035
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1036
  {
1037
    return cmList::Insert(container, pos, first, last, ExpandElements::Yes,
1038
                          emptyElements);
1039
  }
1040
1041
  static std::vector<std::string>::iterator append(
1042
    std::vector<std::string>& container, cm::string_view value,
1043
    EmptyElements emptyElements = EmptyElements::No)
1044
13.4k
  {
1045
13.4k
    return cmList::insert(container, container.cend(), value, emptyElements);
1046
13.4k
  }
1047
  static std::vector<std::string>::iterator append(
1048
    std::vector<std::string>& container, std::string const& value,
1049
    EmptyElements emptyElements = EmptyElements::No)
1050
0
  {
1051
0
    return cmList::insert(container, container.cend(), value, emptyElements);
1052
0
  }
1053
  static std::vector<std::string>::iterator append(
1054
    std::vector<std::string>& container, cmValue value,
1055
    EmptyElements emptyElements = EmptyElements::No)
1056
0
  {
1057
0
    if (value) {
1058
0
      return cmList::append(container, *value, emptyElements);
1059
0
    }
1060
1061
0
    return container.end();
1062
0
  }
1063
  template <typename InputIterator>
1064
  static std::vector<std::string>::iterator append(
1065
    std::vector<std::string>& container, InputIterator first,
1066
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1067
  {
1068
    return cmList::insert(container, container.cend(), first, last,
1069
                          emptyElements);
1070
  }
1071
1072
  static std::vector<std::string>::iterator prepend(
1073
    std::vector<std::string>& container, cm::string_view value,
1074
    EmptyElements emptyElements = EmptyElements::No)
1075
0
  {
1076
0
    return cmList::insert(container, container.cbegin(), value, emptyElements);
1077
0
  }
1078
  static std::vector<std::string>::iterator prepend(
1079
    std::vector<std::string>& container, std::string const& value,
1080
    EmptyElements emptyElements = EmptyElements::No)
1081
0
  {
1082
0
    return cmList::insert(container, container.cbegin(), value, emptyElements);
1083
0
  }
1084
  static std::vector<std::string>::iterator prepend(
1085
    std::vector<std::string>& container, cmValue value,
1086
    EmptyElements emptyElements = EmptyElements::No)
1087
0
  {
1088
0
    if (value) {
1089
0
      return cmList::prepend(container, *value, emptyElements);
1090
0
    }
1091
0
1092
0
    return container.begin();
1093
0
  }
1094
  template <typename InputIterator>
1095
  static std::vector<std::string>::iterator prepend(
1096
    std::vector<std::string>& container, InputIterator first,
1097
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1098
  {
1099
    return cmList::insert(container, container.cbegin(), first, last,
1100
                          emptyElements);
1101
  }
1102
1103
  // The following methods offer the possibility to extend a CMake list
1104
  // but without any intermediate expansion. So the operation is simply a
1105
  // string concatenation with special handling for the CMake list item
1106
  // separator
1107
  static std::string& append(std::string& list, std::string&& value);
1108
  static std::string& append(std::string& list, cm::string_view value);
1109
  template <typename InputIterator>
1110
  static std::string& append(std::string& list, InputIterator first,
1111
                             InputIterator last)
1112
0
  {
1113
0
    if (first == last) {
1114
0
      return list;
1115
0
    }
1116
1117
0
    return cmList::append(
1118
0
      list, cmList::Join(first, last, cmList::element_separator));
1119
0
  }
1120
1121
  static std::string& prepend(std::string& list, std::string&& value);
1122
  static std::string& prepend(std::string& list, cm::string_view value);
1123
  template <typename InputIterator>
1124
  static std::string& prepend(std::string& list, InputIterator first,
1125
                              InputIterator last)
1126
0
  {
1127
0
    if (first == last) {
1128
0
      return list;
1129
0
    }
1130
1131
0
    return cmList::prepend(
1132
0
      list, cmList::Join(first, last, cmList::element_separator));
1133
0
  }
1134
1135
  template <typename Range,
1136
            cm::enable_if_t<cm::is_range<Range>::value, int> = 0>
1137
  static std::string to_string(Range const& r)
1138
0
  {
1139
0
    return cmList::Join(r, cmList::element_separator);
1140
0
  }
Unexecuted instantiation: _ZN6cmList9to_stringINSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEETnNS1_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEES8_RKSC_
Unexecuted instantiation: _ZN6cmList9to_stringINSt3__16vectorINS1_17basic_string_viewIcNS1_11char_traitsIcEEEENS1_9allocatorIS6_EEEETnNS1_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEENS1_12basic_stringIcS5_NS7_IcEEEERKSB_
Unexecuted instantiation: _ZN6cmList9to_stringI7cmRangeIN14RangeIterators17TransformIteratorINSt3__111__wrap_iterIPKNS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEEEPFSB_RSC_EEEETnNS4_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEESB_RKSL_
Unexecuted instantiation: _ZN6cmList9to_stringI7cmRangeINSt3__111__wrap_iterIPNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEETnNS2_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEES9_RKSE_
Unexecuted instantiation: _ZN6cmList9to_stringINSt3__13setINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_4lessIS8_EENS6_IS8_EEEETnNS1_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEES8_RKSE_
Unexecuted instantiation: _ZN6cmList9to_stringI7cmRangeINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEETnNS2_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEES9_RKSF_
Unexecuted instantiation: _ZN6cmList9to_stringI7cmRangeINSt3__121__tree_const_iteratorINS2_17basic_string_viewIcNS2_11char_traitsIcEEEEPNS2_11__tree_nodeIS7_PvEElEEETnNS2_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEENS2_12basic_stringIcS6_NS2_9allocatorIcEEEERKSF_
Unexecuted instantiation: _ZN6cmList9to_stringINSt3__16vectorI2BTINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEENS7_ISA_EEEETnNS1_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEES9_RKSE_
Unexecuted instantiation: cmMakefile.cxx:_ZN6cmList9to_stringI7cmRangeIN14RangeIterators17TransformIteratorINS2_14FilterIteratorINSt3__111__wrap_iterIPKN10cmMakefile12DeferCommandEEEZNKS7_15DeferGetCallIdsEvE3$_0EEZNKS7_15DeferGetCallIdsEvE3$_1EEETnNS5_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEENS5_12basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEERKSI_
Unexecuted instantiation: _ZN6cmList9to_stringI7cmRangeINSt3__111__wrap_iterIPK2BTINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEETnNS2_9enable_ifIXsr2cm8is_rangeIT_EE5valueEiE4typeELi0EEESA_RKSH_
1141
1142
  // Non-members
1143
  // ===========
1144
  friend bool operator==(cmList const& lhs, cmList const& rhs) noexcept
1145
0
  {
1146
0
    return lhs.Values == rhs.Values;
1147
0
  }
1148
  friend bool operator!=(cmList const& lhs, cmList const& rhs) noexcept
1149
0
  {
1150
0
    return lhs.Values != rhs.Values;
1151
0
  }
1152
1153
private:
1154
  size_type ComputeIndex(index_type pos, bool boundCheck = true) const;
1155
  size_type ComputeInsertIndex(index_type pos, bool boundCheck = true) const;
1156
1157
  cmList GetItems(std::vector<index_type>&& indexes) const;
1158
1159
  cmList& RemoveItems(std::vector<index_type>&& indexes);
1160
  cmList& RemoveItems(std::vector<std::string>&& items);
1161
1162
  static container_type::iterator Insert(container_type& container,
1163
                                         container_type::const_iterator pos,
1164
                                         std::string&& value,
1165
                                         ExpandElements expandElements,
1166
                                         EmptyElements emptyElements);
1167
  static container_type::iterator Insert(container_type& container,
1168
                                         container_type::const_iterator pos,
1169
                                         std::string const& value,
1170
                                         ExpandElements expandElements,
1171
                                         EmptyElements emptyElements)
1172
0
  {
1173
0
    auto tmp = value;
1174
0
    return cmList::Insert(container, pos, std::move(tmp), expandElements,
1175
0
                          emptyElements);
1176
0
  }
1177
  template <typename InputIterator>
1178
  static container_type::iterator Insert(container_type& container,
1179
                                         container_type::const_iterator pos,
1180
                                         InputIterator first,
1181
                                         InputIterator last,
1182
                                         ExpandElements expandElements,
1183
                                         EmptyElements emptyElements)
1184
0
  {
1185
0
    auto delta = std::distance(container.cbegin(), pos);
1186
1187
0
    if (first == last) {
1188
0
      return container.begin() + delta;
1189
0
    }
1190
1191
0
    auto insertPos = container.begin() + delta;
1192
0
    if (expandElements == ExpandElements::Yes) {
1193
0
      for (; first != last; ++first) {
1194
0
        auto size = container.size();
1195
0
        insertPos = cmList::Insert(container, insertPos, *first,
1196
0
                                   expandElements, emptyElements);
1197
0
        insertPos += static_cast<decltype(delta)>(container.size() - size);
1198
0
      }
1199
0
    } else {
1200
0
      for (; first != last; ++first) {
1201
0
        if (!(*first).empty() || emptyElements == EmptyElements::Yes) {
1202
0
          insertPos = container.insert(insertPos, *first);
1203
0
          ++insertPos;
1204
0
        }
1205
0
      }
1206
0
    }
1207
1208
0
    return container.begin() + delta;
1209
0
  }
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::Insert<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::Insert<std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, std::__1::move_iterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::Insert<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*, cmList::ExpandElements, cmList::EmptyElements)
Unexecuted instantiation: std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> cmList::Insert<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, cmList::ExpandElements, cmList::EmptyElements)
1210
1211
0
  static std::string const& ToString(std::string const& s) { return s; }
1212
0
  static std::string ToString(cm::string_view s) { return std::string{ s }; }
1213
  static std::string const& ToString(BT<std::string> const&);
1214
1215
  template <typename Range>
1216
  static std::string Join(Range const& r, cm::string_view glue)
1217
0
  {
1218
0
    if (cm::size(r) == 0) {
1219
0
      return std::string{};
1220
0
    }
1221
1222
0
    return cmList::Join(std::begin(r), std::end(r), glue);
1223
0
  }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::vector<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::allocator<std::__1::basic_string_view<char, std::__1::char_traits<char> > > > >(std::__1::vector<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::allocator<std::__1::basic_string_view<char, std::__1::char_traits<char> > > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<cmRange<RangeIterators::TransformIterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)> > >(cmRange<RangeIterators::TransformIterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<cmRange<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > >(cmRange<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<cmRange<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> > >(cmRange<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<cmRange<std::__1::__tree_const_iterator<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::__tree_node<std::__1::basic_string_view<char, std::__1::char_traits<char> >, void*>*, long> > >(cmRange<std::__1::__tree_const_iterator<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::__tree_node<std::__1::basic_string_view<char, std::__1::char_traits<char> >, void*>*, long> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::vector<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > >(std::__1::vector<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: cmMakefile.cxx:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<cmRange<RangeIterators::TransformIterator<RangeIterators::FilterIterator<std::__1::__wrap_iter<cmMakefile::DeferCommand const*>, cmMakefile::DeferGetCallIds() const::$_0>, cmMakefile::DeferGetCallIds() const::$_1> > >(cmRange<RangeIterators::TransformIterator<RangeIterators::FilterIterator<std::__1::__wrap_iter<cmMakefile::DeferCommand const*>, cmMakefile::DeferGetCallIds() const::$_0>, cmMakefile::DeferGetCallIds() const::$_1> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<cmRange<std::__1::__wrap_iter<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const*> > >(cmRange<std::__1::__wrap_iter<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const*> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
1224
  template <typename InputIterator>
1225
  static std::string Join(InputIterator first, InputIterator last,
1226
                          cm::string_view glue)
1227
0
  {
1228
0
    if (first == last) {
1229
0
      return std::string{};
1230
0
    }
1231
1232
0
    auto const sep = std::string{ glue };
1233
1234
0
    std::string joined = cmList::ToString(*first);
1235
0
    for (auto it = std::next(first); it != last; ++it) {
1236
0
      joined += sep;
1237
0
      joined += cmList::ToString(*it);
1238
0
    }
1239
1240
0
    return joined;
1241
0
  }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::__wrap_iter<std::__1::basic_string_view<char, std::__1::char_traits<char> > const*> >(std::__1::__wrap_iter<std::__1::basic_string_view<char, std::__1::char_traits<char> > const*>, std::__1::__wrap_iter<std::__1::basic_string_view<char, std::__1::char_traits<char> > const*>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<RangeIterators::TransformIterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)> >(RangeIterators::TransformIterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)>, RangeIterators::TransformIterator<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::__tree_const_iterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__tree_node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void*>*, long> >(std::__1::__tree_const_iterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__tree_node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void*>*, long>, std::__1::__tree_const_iterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__tree_node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void*>*, long>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::__tree_const_iterator<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::__tree_node<std::__1::basic_string_view<char, std::__1::char_traits<char> >, void*>*, long> >(std::__1::__tree_const_iterator<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::__tree_node<std::__1::basic_string_view<char, std::__1::char_traits<char> >, void*>*, long>, std::__1::__tree_const_iterator<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::__tree_node<std::__1::basic_string_view<char, std::__1::char_traits<char> >, void*>*, long>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<std::__1::__wrap_iter<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const*> >(std::__1::__wrap_iter<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const*>, std::__1::__wrap_iter<BT<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const*>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Unexecuted instantiation: cmMakefile.cxx:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > cmList::Join<RangeIterators::TransformIterator<RangeIterators::FilterIterator<std::__1::__wrap_iter<cmMakefile::DeferCommand const*>, cmMakefile::DeferGetCallIds() const::$_0>, cmMakefile::DeferGetCallIds() const::$_1> >(RangeIterators::TransformIterator<RangeIterators::FilterIterator<std::__1::__wrap_iter<cmMakefile::DeferCommand const*>, cmMakefile::DeferGetCallIds() const::$_0>, cmMakefile::DeferGetCallIds() const::$_1>, RangeIterators::TransformIterator<RangeIterators::FilterIterator<std::__1::__wrap_iter<cmMakefile::DeferCommand const*>, cmMakefile::DeferGetCallIds() const::$_0>, cmMakefile::DeferGetCallIds() const::$_1>, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
1242
1243
  container_type Values;
1244
};
1245
1246
// specializations for cmList::TransformSelector allocators
1247
// ========================================================
1248
template <>
1249
inline std::unique_ptr<cmList::TransformSelector>
1250
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1251
  std::initializer_list<index_type> init)
1252
0
{
1253
0
  return cmList::TransformSelector::NewAT(init);
1254
0
}
1255
template <>
1256
inline std::unique_ptr<cmList::TransformSelector>
1257
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1258
  std::vector<index_type> const& init)
1259
0
{
1260
0
  return cmList::TransformSelector::NewAT(init);
1261
0
}
1262
template <>
1263
inline std::unique_ptr<cmList::TransformSelector>
1264
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1265
  std::vector<index_type>&& init)
1266
0
{
1267
0
  return cmList::TransformSelector::NewAT(std::move(init));
1268
0
}
1269
1270
template <>
1271
inline std::unique_ptr<cmList::TransformSelector>
1272
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1273
  std::initializer_list<index_type> init)
1274
0
{
1275
0
  return cmList::TransformSelector::NewFOR(init);
1276
0
}
1277
template <>
1278
inline std::unique_ptr<cmList::TransformSelector>
1279
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1280
  std::vector<index_type> const& init)
1281
0
{
1282
0
  return cmList::TransformSelector::NewFOR(init);
1283
0
}
1284
template <>
1285
inline std::unique_ptr<cmList::TransformSelector>
1286
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1287
  std::vector<index_type>&& init)
1288
0
{
1289
0
  return cmList::TransformSelector::NewFOR(std::move(init));
1290
0
}
1291
1292
template <>
1293
inline std::unique_ptr<cmList::TransformSelector>
1294
cmList::TransformSelector::New<cmList::TransformSelector::REGEX>(
1295
  std::string const& init)
1296
0
{
1297
0
  return cmList::TransformSelector::NewREGEX(init);
1298
0
}
1299
template <>
1300
inline std::unique_ptr<cmList::TransformSelector>
1301
cmList::TransformSelector::New<cmList::TransformSelector::REGEX>(
1302
  std::string&& init)
1303
0
{
1304
0
  return cmList::TransformSelector::NewREGEX(std::move(init));
1305
0
}
1306
1307
// Non-member functions
1308
// ====================
1309
inline std::vector<std::string>& operator+=(std::vector<std::string>& l,
1310
                                            cmList const& r)
1311
0
{
1312
0
  l.insert(l.end(), r.begin(), r.end());
1313
0
  return l;
1314
0
}
1315
inline std::vector<std::string>& operator+=(std::vector<std::string>& l,
1316
                                            cmList&& r)
1317
0
{
1318
0
  std::move(r.begin(), r.end(), std::back_inserter(l));
1319
0
  r.clear();
1320
1321
0
  return l;
1322
0
}
1323
1324
inline void swap(cmList& lhs, cmList& rhs) noexcept
1325
0
{
1326
0
  lhs.swap(rhs);
1327
0
}
1328
1329
namespace cm {
1330
inline void erase(cmList& list, std::string const& value)
1331
0
{
1332
0
  list.erase(std::remove(list.begin(), list.end(), value), list.end());
1333
0
}
1334
1335
template <typename Predicate>
1336
inline void erase_if(cmList& list, Predicate pred)
1337
0
{
1338
0
  list.erase(std::remove_if(list.begin(), list.end(), pred), list.end());
1339
0
}
Unexecuted instantiation: void cm::erase_if<LinkLibraryNode::Evaluate(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, cm::GenEx::Evaluation*, GeneratorExpressionContent const*, cmGeneratorExpressionDAGChecker*) const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}>(cmList&, LinkLibraryNode::Evaluate(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, cm::GenEx::Evaluation*, GeneratorExpressionContent const*, cmGeneratorExpressionDAGChecker*) const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1})
Unexecuted instantiation: void cm::erase_if<DeviceLinkNode::Evaluate(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, cm::GenEx::Evaluation*, GeneratorExpressionContent const*, cmGeneratorExpressionDAGChecker*) const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}>(cmList&, DeviceLinkNode::Evaluate(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, cm::GenEx::Evaluation*, GeneratorExpressionContent const*, cmGeneratorExpressionDAGChecker*) const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1})
Unexecuted instantiation: cmGeneratorTarget.cxx:void cm::erase_if<cmGeneratorTarget::GetLinkerTypeProperty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const::$_0>(cmList&, cmGeneratorTarget::GetLinkerTypeProperty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const::$_0)
1340
1341
//
1342
// Provide a special implementation of cm::append because, in this case,
1343
// expansion must not be applied to the inserted elements
1344
//
1345
#if defined(__SUNPRO_CC) && defined(__sparc)
1346
// Oracle DeveloperStudio C++ compiler on Solaris/Sparc fails to compile
1347
// templates with constraints.
1348
// So, on this platform, use only simple templates.
1349
template <typename InputIt,
1350
          cm::enable_if_t<cm::is_input_iterator<InputIt>::value, int> = 0>
1351
void append(cmList& v, InputIt first, InputIt last)
1352
{
1353
  v.append(first, last, cmList::ExpandElements::No);
1354
}
1355
1356
template <typename Range,
1357
          cm::enable_if_t<cm::is_input_range<Range>::value, int> = 0>
1358
void append(cmList& v, Range const& r)
1359
{
1360
  v.append(r.begin(), r.end(), cmList::ExpandElements::No);
1361
}
1362
1363
#else
1364
1365
template <
1366
  typename InputIt,
1367
  cm::enable_if_t<
1368
    cm::is_input_iterator<InputIt>::value &&
1369
      std::is_convertible<typename std::iterator_traits<InputIt>::value_type,
1370
                          cmList::value_type>::value,
1371
    int> = 0>
1372
void append(cmList& v, InputIt first, InputIt last)
1373
{
1374
  v.append(first, last, cmList::ExpandElements::No);
1375
}
1376
1377
template <typename Range,
1378
          cm::enable_if_t<cm::is_input_range<Range>::value &&
1379
                            std::is_convertible<typename Range::value_type,
1380
                                                cmList::value_type>::value,
1381
                          int> = 0>
1382
void append(cmList& v, Range const& r)
1383
0
{
1384
0
  v.append(r.begin(), r.end(), cmList::ExpandElements::No);
1385
0
}
1386
#endif
1387
1388
} // namespace cm
1389
1390
/**
1391
 * Helper functions for legacy support. Use preferably cmList class directly
1392
 * or the static methods of the class.
1393
 */
1394
inline void cmExpandList(
1395
  cm::string_view arg, std::vector<std::string>& argsOut,
1396
  cmList::EmptyElements emptyElements = cmList::EmptyElements::No)
1397
13.4k
{
1398
13.4k
  cmList::append(argsOut, arg, emptyElements);
1399
13.4k
}
1400
inline void cmExpandList(
1401
  cmValue arg, std::vector<std::string>& argsOut,
1402
  cmList::EmptyElements emptyElements = cmList::EmptyElements::No)
1403
0
{
1404
0
  cmList::append(argsOut, arg, emptyElements);
1405
0
}