Coverage Report

Created: 2026-06-15 07:03

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<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 (&) [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<>()
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 or predicate
825
  // function is unknown / does not set its output variable
826
  cmList& filter(cm::string_view regex, FilterMode mode);
827
  cmList& filter(std::string const& functionName, FilterMode mode,
828
                 cmMakefile& makefile);
829
830
  cmList& reverse()
831
0
  {
832
0
    std::reverse(this->Values.begin(), this->Values.end());
833
0
    return *this;
834
0
  }
835
836
  struct SortConfiguration
837
  {
838
    enum class OrderMode
839
    {
840
      DEFAULT,
841
      ASCENDING,
842
      DESCENDING,
843
    } Order = OrderMode::DEFAULT;
844
845
    enum class CompareMethod
846
    {
847
      DEFAULT,
848
      STRING,
849
      FILE_BASENAME,
850
      NATURAL,
851
      COMPARATOR,
852
    } Compare = CompareMethod::DEFAULT;
853
854
    enum class CaseSensitivity
855
    {
856
      DEFAULT,
857
      SENSITIVE,
858
      INSENSITIVE,
859
    } Case = CaseSensitivity::DEFAULT;
860
861
    std::string ComparatorFunction;
862
863
    // declare the default constructor to work-around clang bug
864
    SortConfiguration();
865
866
    SortConfiguration(OrderMode order, CompareMethod compare,
867
                      CaseSensitivity caseSensitivity)
868
      : Order(order)
869
      , Compare(compare)
870
      , Case(caseSensitivity)
871
0
    {
872
0
    }
873
  };
874
  cmList& sort(SortConfiguration config = SortConfiguration{});
875
  cmList& sort(SortConfiguration config, cmMakefile& makefile);
876
877
  // exception raised on error during transform operations
878
  class transform_error : public std::runtime_error
879
  {
880
  public:
881
    transform_error(std::string const& error)
882
0
      : std::runtime_error(error)
883
0
    {
884
0
    }
885
  };
886
887
  class TransformSelector
888
  {
889
  public:
890
    using index_type = cmList::index_type;
891
892
    // define some structs used as template selector
893
    struct AT;
894
    struct FOR;
895
    struct REGEX;
896
    struct PREDICATE;
897
898
0
    virtual ~TransformSelector() = default;
899
900
    virtual std::string const& GetTag() = 0;
901
902
    // method NEW is used to allocate a selector of the needed type.
903
    // For example:
904
    // cmList::TransformSelector::New<AT>({1, 2, 5, 6});
905
    //  or
906
    // cmList::TransformSelector::New<REGEX>("^XX.*");
907
    static std::unique_ptr<TransformSelector> New();
908
    template <typename Type>
909
    static std::unique_ptr<TransformSelector> New(
910
      std::initializer_list<index_type>);
911
    template <typename Type>
912
    static std::unique_ptr<TransformSelector> New(
913
      std::vector<index_type> const&);
914
    template <typename Type>
915
    static std::unique_ptr<TransformSelector> New(std::vector<index_type>&&);
916
917
    template <typename Type>
918
    static std::unique_ptr<TransformSelector> New(std::string const&);
919
    template <typename Type>
920
    static std::unique_ptr<TransformSelector> New(std::string&&);
921
922
    // NewPREDICATE is public (unlike NewAT/NewFOR/NewREGEX) because it takes
923
    // a cmMakefile& parameter that cannot be dispatched through the existing
924
    // New<Type>() templates.
925
    static std::unique_ptr<TransformSelector> NewPREDICATE(
926
      std::string const& functionName, cmMakefile& makefile);
927
928
    cmMakefile* Makefile = nullptr;
929
930
  private:
931
    static std::unique_ptr<TransformSelector> NewAT(
932
      std::initializer_list<index_type> init);
933
    static std::unique_ptr<TransformSelector> NewAT(
934
      std::vector<index_type> const& init);
935
    static std::unique_ptr<TransformSelector> NewAT(
936
      std::vector<index_type>&& init);
937
938
    static std::unique_ptr<TransformSelector> NewFOR(
939
      std::initializer_list<index_type> init);
940
    static std::unique_ptr<TransformSelector> NewFOR(
941
      std::vector<index_type> const& init);
942
    static std::unique_ptr<TransformSelector> NewFOR(
943
      std::vector<index_type>&& init);
944
945
    static std::unique_ptr<TransformSelector> NewREGEX(
946
      std::string const& init);
947
    static std::unique_ptr<TransformSelector> NewREGEX(std::string&& init);
948
  };
949
950
  enum class TransformAction
951
  {
952
    APPEND,
953
    PREPEND,
954
    TOLOWER,
955
    TOUPPER,
956
    STRIP,
957
    GENEX_STRIP,
958
    REPLACE,
959
    APPLY
960
  };
961
962
  // Transforms the list by applying an action
963
  // Throw std::transform_error is any of arguments specified are invalid
964
  cmList& transform(TransformAction action,
965
                    std::unique_ptr<TransformSelector> = {});
966
  cmList& transform(TransformAction action, std::string const& arg,
967
                    std::unique_ptr<TransformSelector> = {});
968
  cmList& transform(TransformAction action, std::string const& arg1,
969
                    std::string const& arg2,
970
                    std::unique_ptr<TransformSelector> = {});
971
  cmList& transform(TransformAction action,
972
                    std::vector<std::string> const& args,
973
                    std::unique_ptr<TransformSelector> = {});
974
  cmList& transform(TransformAction action, std::string const& arg,
975
                    cmMakefile& makefile,
976
                    std::unique_ptr<TransformSelector> = {});
977
978
  std::string join(cm::string_view glue) const
979
0
  {
980
0
    return cmList::Join(this->Values, glue);
981
0
  }
982
983
0
  void swap(cmList& other) noexcept { this->Values.swap(other.Values); }
984
985
  // static members
986
  // ==============
987
  // these methods can be used to store CMake list expansion directly in a
988
  // std::vector.
989
  static void assign(std::vector<std::string>& container,
990
                     cm::string_view value,
991
                     EmptyElements emptyElements = EmptyElements::No)
992
0
  {
993
0
    container.clear();
994
0
    cmList::append(container, value, emptyElements);
995
0
  }
996
  static void assign(std::vector<std::string>& container,
997
                     std::string const& value,
998
                     EmptyElements emptyElements = EmptyElements::No)
999
0
  {
1000
0
    container.clear();
1001
0
    cmList::append(container, value, emptyElements);
1002
0
  }
1003
  static void assign(std::vector<std::string>& container, cmValue value,
1004
                     EmptyElements emptyElements = EmptyElements::No)
1005
0
  {
1006
0
    if (value) {
1007
0
      cmList::assign(container, *value, emptyElements);
1008
0
    } else {
1009
0
      container.clear();
1010
0
    }
1011
0
  }
1012
  template <typename InputIterator>
1013
  static void assign(std::vector<std::string>& container, InputIterator first,
1014
                     InputIterator last,
1015
                     EmptyElements emptyElements = EmptyElements::No)
1016
  {
1017
    container.clear();
1018
    cmList::append(container, first, last, emptyElements);
1019
  }
1020
1021
  static std::vector<std::string>::iterator insert(
1022
    std::vector<std::string>& container,
1023
    std::vector<std::string>::const_iterator pos, cm::string_view value,
1024
    EmptyElements emptyElements = EmptyElements::No)
1025
21.7k
  {
1026
21.7k
    return cmList::Insert(container, pos, std::string(value),
1027
21.7k
                          ExpandElements::Yes, emptyElements);
1028
21.7k
  }
1029
  static std::vector<std::string>::iterator insert(
1030
    std::vector<std::string>& container,
1031
    std::vector<std::string>::const_iterator pos, std::string const& value,
1032
    EmptyElements emptyElements = EmptyElements::No)
1033
0
  {
1034
0
    return cmList::Insert(container, pos, value, ExpandElements::Yes,
1035
0
                          emptyElements);
1036
0
  }
1037
  static std::vector<std::string>::iterator insert(
1038
    std::vector<std::string>& container,
1039
    std::vector<std::string>::const_iterator pos, cmValue value,
1040
    EmptyElements emptyElements = EmptyElements::No)
1041
0
  {
1042
0
    if (value) {
1043
0
      return cmList::insert(container, pos, *value, emptyElements);
1044
0
    }
1045
0
1046
0
    auto delta = std::distance(container.cbegin(), pos);
1047
0
    return container.begin() + delta;
1048
0
  }
1049
  template <typename InputIterator>
1050
  static std::vector<std::string>::iterator insert(
1051
    std::vector<std::string>& container,
1052
    std::vector<std::string>::const_iterator pos, InputIterator first,
1053
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1054
  {
1055
    return cmList::Insert(container, pos, first, last, ExpandElements::Yes,
1056
                          emptyElements);
1057
  }
1058
1059
  static std::vector<std::string>::iterator append(
1060
    std::vector<std::string>& container, cm::string_view value,
1061
    EmptyElements emptyElements = EmptyElements::No)
1062
21.7k
  {
1063
21.7k
    return cmList::insert(container, container.cend(), value, emptyElements);
1064
21.7k
  }
1065
  static std::vector<std::string>::iterator append(
1066
    std::vector<std::string>& container, std::string const& value,
1067
    EmptyElements emptyElements = EmptyElements::No)
1068
0
  {
1069
0
    return cmList::insert(container, container.cend(), value, emptyElements);
1070
0
  }
1071
  static std::vector<std::string>::iterator append(
1072
    std::vector<std::string>& container, cmValue value,
1073
    EmptyElements emptyElements = EmptyElements::No)
1074
0
  {
1075
0
    if (value) {
1076
0
      return cmList::append(container, *value, emptyElements);
1077
0
    }
1078
1079
0
    return container.end();
1080
0
  }
1081
  template <typename InputIterator>
1082
  static std::vector<std::string>::iterator append(
1083
    std::vector<std::string>& container, InputIterator first,
1084
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1085
  {
1086
    return cmList::insert(container, container.cend(), first, last,
1087
                          emptyElements);
1088
  }
1089
1090
  static std::vector<std::string>::iterator prepend(
1091
    std::vector<std::string>& container, cm::string_view value,
1092
    EmptyElements emptyElements = EmptyElements::No)
1093
0
  {
1094
0
    return cmList::insert(container, container.cbegin(), value, emptyElements);
1095
0
  }
1096
  static std::vector<std::string>::iterator prepend(
1097
    std::vector<std::string>& container, std::string const& value,
1098
    EmptyElements emptyElements = EmptyElements::No)
1099
0
  {
1100
0
    return cmList::insert(container, container.cbegin(), value, emptyElements);
1101
0
  }
1102
  static std::vector<std::string>::iterator prepend(
1103
    std::vector<std::string>& container, cmValue value,
1104
    EmptyElements emptyElements = EmptyElements::No)
1105
0
  {
1106
0
    if (value) {
1107
0
      return cmList::prepend(container, *value, emptyElements);
1108
0
    }
1109
0
1110
0
    return container.begin();
1111
0
  }
1112
  template <typename InputIterator>
1113
  static std::vector<std::string>::iterator prepend(
1114
    std::vector<std::string>& container, InputIterator first,
1115
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1116
  {
1117
    return cmList::insert(container, container.cbegin(), first, last,
1118
                          emptyElements);
1119
  }
1120
1121
  // The following methods offer the possibility to extend a CMake list
1122
  // but without any intermediate expansion. So the operation is simply a
1123
  // string concatenation with special handling for the CMake list item
1124
  // separator
1125
  static std::string& append(std::string& list, std::string&& value);
1126
  static std::string& append(std::string& list, cm::string_view value);
1127
  template <typename InputIterator>
1128
  static std::string& append(std::string& list, InputIterator first,
1129
                             InputIterator last)
1130
0
  {
1131
0
    if (first == last) {
1132
0
      return list;
1133
0
    }
1134
1135
0
    return cmList::append(
1136
0
      list, cmList::Join(first, last, cmList::element_separator));
1137
0
  }
1138
1139
  static std::string& prepend(std::string& list, std::string&& value);
1140
  static std::string& prepend(std::string& list, cm::string_view value);
1141
  template <typename InputIterator>
1142
  static std::string& prepend(std::string& list, InputIterator first,
1143
                              InputIterator last)
1144
0
  {
1145
0
    if (first == last) {
1146
0
      return list;
1147
0
    }
1148
1149
0
    return cmList::prepend(
1150
0
      list, cmList::Join(first, last, cmList::element_separator));
1151
0
  }
1152
1153
  template <typename Range,
1154
            cm::enable_if_t<cm::is_range<Range>::value, int> = 0>
1155
  static std::string to_string(Range const& r)
1156
0
  {
1157
0
    return cmList::Join(r, cmList::element_separator);
1158
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_
1159
1160
  // Non-members
1161
  // ===========
1162
  friend bool operator==(cmList const& lhs, cmList const& rhs) noexcept
1163
0
  {
1164
0
    return lhs.Values == rhs.Values;
1165
0
  }
1166
  friend bool operator!=(cmList const& lhs, cmList const& rhs) noexcept
1167
0
  {
1168
0
    return lhs.Values != rhs.Values;
1169
0
  }
1170
1171
private:
1172
  size_type ComputeIndex(index_type pos, bool boundCheck = true) const;
1173
  size_type ComputeInsertIndex(index_type pos, bool boundCheck = true) const;
1174
1175
  cmList GetItems(std::vector<index_type>&& indexes) const;
1176
1177
  cmList& RemoveItems(std::vector<index_type>&& indexes);
1178
  cmList& RemoveItems(std::vector<std::string>&& items);
1179
1180
  static container_type::iterator Insert(container_type& container,
1181
                                         container_type::const_iterator pos,
1182
                                         std::string&& value,
1183
                                         ExpandElements expandElements,
1184
                                         EmptyElements emptyElements);
1185
  static container_type::iterator Insert(container_type& container,
1186
                                         container_type::const_iterator pos,
1187
                                         std::string const& value,
1188
                                         ExpandElements expandElements,
1189
                                         EmptyElements emptyElements)
1190
0
  {
1191
0
    auto tmp = value;
1192
0
    return cmList::Insert(container, pos, std::move(tmp), expandElements,
1193
0
                          emptyElements);
1194
0
  }
1195
  template <typename InputIterator>
1196
  static container_type::iterator Insert(container_type& container,
1197
                                         container_type::const_iterator pos,
1198
                                         InputIterator first,
1199
                                         InputIterator last,
1200
                                         ExpandElements expandElements,
1201
                                         EmptyElements emptyElements)
1202
0
  {
1203
0
    auto delta = std::distance(container.cbegin(), pos);
1204
1205
0
    if (first == last) {
1206
0
      return container.begin() + delta;
1207
0
    }
1208
1209
0
    auto insertPos = container.begin() + delta;
1210
0
    if (expandElements == ExpandElements::Yes) {
1211
0
      for (; first != last; ++first) {
1212
0
        auto size = container.size();
1213
0
        insertPos = cmList::Insert(container, insertPos, *first,
1214
0
                                   expandElements, emptyElements);
1215
0
        insertPos += static_cast<decltype(delta)>(container.size() - size);
1216
0
      }
1217
0
    } else {
1218
0
      for (; first != last; ++first) {
1219
0
        if (!(*first).empty() || emptyElements == EmptyElements::Yes) {
1220
0
          insertPos = container.insert(insertPos, *first);
1221
0
          ++insertPos;
1222
0
        }
1223
0
      }
1224
0
    }
1225
1226
0
    return container.begin() + delta;
1227
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)
1228
1229
0
  static std::string const& ToString(std::string const& s) { return s; }
1230
0
  static std::string ToString(cm::string_view s) { return std::string{ s }; }
1231
  static std::string const& ToString(BT<std::string> const&);
1232
1233
  template <typename Range>
1234
  static std::string Join(Range const& r, cm::string_view glue)
1235
0
  {
1236
0
    if (cm::size(r) == 0) {
1237
0
      return std::string{};
1238
0
    }
1239
1240
0
    return cmList::Join(std::begin(r), std::end(r), glue);
1241
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> >)
1242
  template <typename InputIterator>
1243
  static std::string Join(InputIterator first, InputIterator last,
1244
                          cm::string_view glue)
1245
0
  {
1246
0
    if (first == last) {
1247
0
      return std::string{};
1248
0
    }
1249
1250
0
    auto const sep = std::string{ glue };
1251
1252
0
    std::string joined = cmList::ToString(*first);
1253
0
    for (auto it = std::next(first); it != last; ++it) {
1254
0
      joined += sep;
1255
0
      joined += cmList::ToString(*it);
1256
0
    }
1257
1258
0
    return joined;
1259
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> >)
1260
1261
  container_type Values;
1262
};
1263
1264
// specializations for cmList::TransformSelector allocators
1265
// ========================================================
1266
template <>
1267
inline std::unique_ptr<cmList::TransformSelector>
1268
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1269
  std::initializer_list<index_type> init)
1270
0
{
1271
0
  return cmList::TransformSelector::NewAT(init);
1272
0
}
1273
template <>
1274
inline std::unique_ptr<cmList::TransformSelector>
1275
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1276
  std::vector<index_type> const& init)
1277
0
{
1278
0
  return cmList::TransformSelector::NewAT(init);
1279
0
}
1280
template <>
1281
inline std::unique_ptr<cmList::TransformSelector>
1282
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1283
  std::vector<index_type>&& init)
1284
0
{
1285
0
  return cmList::TransformSelector::NewAT(std::move(init));
1286
0
}
1287
1288
template <>
1289
inline std::unique_ptr<cmList::TransformSelector>
1290
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1291
  std::initializer_list<index_type> init)
1292
0
{
1293
0
  return cmList::TransformSelector::NewFOR(init);
1294
0
}
1295
template <>
1296
inline std::unique_ptr<cmList::TransformSelector>
1297
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1298
  std::vector<index_type> const& init)
1299
0
{
1300
0
  return cmList::TransformSelector::NewFOR(init);
1301
0
}
1302
template <>
1303
inline std::unique_ptr<cmList::TransformSelector>
1304
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1305
  std::vector<index_type>&& init)
1306
0
{
1307
0
  return cmList::TransformSelector::NewFOR(std::move(init));
1308
0
}
1309
1310
template <>
1311
inline std::unique_ptr<cmList::TransformSelector>
1312
cmList::TransformSelector::New<cmList::TransformSelector::REGEX>(
1313
  std::string const& init)
1314
0
{
1315
0
  return cmList::TransformSelector::NewREGEX(init);
1316
0
}
1317
template <>
1318
inline std::unique_ptr<cmList::TransformSelector>
1319
cmList::TransformSelector::New<cmList::TransformSelector::REGEX>(
1320
  std::string&& init)
1321
0
{
1322
0
  return cmList::TransformSelector::NewREGEX(std::move(init));
1323
0
}
1324
1325
// Non-member functions
1326
// ====================
1327
inline std::vector<std::string>& operator+=(std::vector<std::string>& l,
1328
                                            cmList const& r)
1329
0
{
1330
0
  l.insert(l.end(), r.begin(), r.end());
1331
0
  return l;
1332
0
}
1333
inline std::vector<std::string>& operator+=(std::vector<std::string>& l,
1334
                                            cmList&& r)
1335
0
{
1336
0
  std::move(r.begin(), r.end(), std::back_inserter(l));
1337
0
  r.clear();
1338
1339
0
  return l;
1340
0
}
1341
1342
inline void swap(cmList& lhs, cmList& rhs) noexcept
1343
0
{
1344
0
  lhs.swap(rhs);
1345
0
}
1346
1347
namespace cm {
1348
inline void erase(cmList& list, std::string const& value)
1349
0
{
1350
0
  list.erase(std::remove(list.begin(), list.end(), value), list.end());
1351
0
}
1352
1353
template <typename Predicate>
1354
inline void erase_if(cmList& list, Predicate pred)
1355
0
{
1356
0
  list.erase(std::remove_if(list.begin(), list.end(), pred), list.end());
1357
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)
1358
1359
//
1360
// Provide a special implementation of cm::append because, in this case,
1361
// expansion must not be applied to the inserted elements
1362
//
1363
#if defined(__SUNPRO_CC) && defined(__sparc)
1364
// Oracle DeveloperStudio C++ compiler on Solaris/Sparc fails to compile
1365
// templates with constraints.
1366
// So, on this platform, use only simple templates.
1367
template <typename InputIt,
1368
          cm::enable_if_t<cm::is_input_iterator<InputIt>::value, int> = 0>
1369
void append(cmList& v, InputIt first, InputIt last)
1370
{
1371
  v.append(first, last, cmList::ExpandElements::No);
1372
}
1373
1374
template <typename Range,
1375
          cm::enable_if_t<cm::is_input_range<Range>::value, int> = 0>
1376
void append(cmList& v, Range const& r)
1377
{
1378
  v.append(r.begin(), r.end(), cmList::ExpandElements::No);
1379
}
1380
1381
#else
1382
1383
template <
1384
  typename InputIt,
1385
  cm::enable_if_t<
1386
    cm::is_input_iterator<InputIt>::value &&
1387
      std::is_convertible<typename std::iterator_traits<InputIt>::value_type,
1388
                          cmList::value_type>::value,
1389
    int> = 0>
1390
void append(cmList& v, InputIt first, InputIt last)
1391
{
1392
  v.append(first, last, cmList::ExpandElements::No);
1393
}
1394
1395
template <typename Range,
1396
          cm::enable_if_t<cm::is_input_range<Range>::value &&
1397
                            std::is_convertible<typename Range::value_type,
1398
                                                cmList::value_type>::value,
1399
                          int> = 0>
1400
void append(cmList& v, Range const& r)
1401
0
{
1402
0
  v.append(r.begin(), r.end(), cmList::ExpandElements::No);
1403
0
}
1404
#endif
1405
1406
} // namespace cm
1407
1408
/**
1409
 * Helper functions for legacy support. Use preferably cmList class directly
1410
 * or the static methods of the class.
1411
 */
1412
inline void cmExpandList(
1413
  cm::string_view arg, std::vector<std::string>& argsOut,
1414
  cmList::EmptyElements emptyElements = cmList::EmptyElements::No)
1415
21.7k
{
1416
21.7k
  cmList::append(argsOut, arg, emptyElements);
1417
21.7k
}
1418
inline void cmExpandList(
1419
  cmValue arg, std::vector<std::string>& argsOut,
1420
  cmList::EmptyElements emptyElements = cmList::EmptyElements::No)
1421
0
{
1422
0
  cmList::append(argsOut, arg, emptyElements);
1423
0
}