Coverage Report

Created: 2026-04-29 07:01

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
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
    APPLY
946
  };
947
948
  // Transforms the list by applying an action
949
  // Throw std::transform_error is any of arguments specified are invalid
950
  cmList& transform(TransformAction action,
951
                    std::unique_ptr<TransformSelector> = {});
952
  cmList& transform(TransformAction action, std::string const& arg,
953
                    std::unique_ptr<TransformSelector> = {});
954
  cmList& transform(TransformAction action, std::string const& arg1,
955
                    std::string const& arg2,
956
                    std::unique_ptr<TransformSelector> = {});
957
  cmList& transform(TransformAction action,
958
                    std::vector<std::string> const& args,
959
                    std::unique_ptr<TransformSelector> = {});
960
  cmList& transform(TransformAction action, std::string const& arg,
961
                    cmMakefile& makefile,
962
                    std::unique_ptr<TransformSelector> = {});
963
964
  std::string join(cm::string_view glue) const
965
0
  {
966
0
    return cmList::Join(this->Values, glue);
967
0
  }
968
969
0
  void swap(cmList& other) noexcept { this->Values.swap(other.Values); }
970
971
  // static members
972
  // ==============
973
  // these methods can be used to store CMake list expansion directly in a
974
  // std::vector.
975
  static void assign(std::vector<std::string>& container,
976
                     cm::string_view value,
977
                     EmptyElements emptyElements = EmptyElements::No)
978
0
  {
979
0
    container.clear();
980
0
    cmList::append(container, value, emptyElements);
981
0
  }
982
  static void assign(std::vector<std::string>& container,
983
                     std::string const& value,
984
                     EmptyElements emptyElements = EmptyElements::No)
985
0
  {
986
0
    container.clear();
987
0
    cmList::append(container, value, emptyElements);
988
0
  }
989
  static void assign(std::vector<std::string>& container, cmValue value,
990
                     EmptyElements emptyElements = EmptyElements::No)
991
0
  {
992
0
    if (value) {
993
0
      cmList::assign(container, *value, emptyElements);
994
0
    } else {
995
0
      container.clear();
996
0
    }
997
0
  }
998
  template <typename InputIterator>
999
  static void assign(std::vector<std::string>& container, InputIterator first,
1000
                     InputIterator last,
1001
                     EmptyElements emptyElements = EmptyElements::No)
1002
  {
1003
    container.clear();
1004
    cmList::append(container, first, last, emptyElements);
1005
  }
1006
1007
  static std::vector<std::string>::iterator insert(
1008
    std::vector<std::string>& container,
1009
    std::vector<std::string>::const_iterator pos, cm::string_view value,
1010
    EmptyElements emptyElements = EmptyElements::No)
1011
14.2k
  {
1012
14.2k
    return cmList::Insert(container, pos, std::string(value),
1013
14.2k
                          ExpandElements::Yes, emptyElements);
1014
14.2k
  }
1015
  static std::vector<std::string>::iterator insert(
1016
    std::vector<std::string>& container,
1017
    std::vector<std::string>::const_iterator pos, std::string const& value,
1018
    EmptyElements emptyElements = EmptyElements::No)
1019
0
  {
1020
0
    return cmList::Insert(container, pos, value, ExpandElements::Yes,
1021
0
                          emptyElements);
1022
0
  }
1023
  static std::vector<std::string>::iterator insert(
1024
    std::vector<std::string>& container,
1025
    std::vector<std::string>::const_iterator pos, cmValue value,
1026
    EmptyElements emptyElements = EmptyElements::No)
1027
0
  {
1028
0
    if (value) {
1029
0
      return cmList::insert(container, pos, *value, emptyElements);
1030
0
    }
1031
0
1032
0
    auto delta = std::distance(container.cbegin(), pos);
1033
0
    return container.begin() + delta;
1034
0
  }
1035
  template <typename InputIterator>
1036
  static std::vector<std::string>::iterator insert(
1037
    std::vector<std::string>& container,
1038
    std::vector<std::string>::const_iterator pos, InputIterator first,
1039
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1040
  {
1041
    return cmList::Insert(container, pos, first, last, ExpandElements::Yes,
1042
                          emptyElements);
1043
  }
1044
1045
  static std::vector<std::string>::iterator append(
1046
    std::vector<std::string>& container, cm::string_view value,
1047
    EmptyElements emptyElements = EmptyElements::No)
1048
14.2k
  {
1049
14.2k
    return cmList::insert(container, container.cend(), value, emptyElements);
1050
14.2k
  }
1051
  static std::vector<std::string>::iterator append(
1052
    std::vector<std::string>& container, std::string const& value,
1053
    EmptyElements emptyElements = EmptyElements::No)
1054
0
  {
1055
0
    return cmList::insert(container, container.cend(), value, emptyElements);
1056
0
  }
1057
  static std::vector<std::string>::iterator append(
1058
    std::vector<std::string>& container, cmValue value,
1059
    EmptyElements emptyElements = EmptyElements::No)
1060
0
  {
1061
0
    if (value) {
1062
0
      return cmList::append(container, *value, emptyElements);
1063
0
    }
1064
1065
0
    return container.end();
1066
0
  }
1067
  template <typename InputIterator>
1068
  static std::vector<std::string>::iterator append(
1069
    std::vector<std::string>& container, InputIterator first,
1070
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1071
  {
1072
    return cmList::insert(container, container.cend(), first, last,
1073
                          emptyElements);
1074
  }
1075
1076
  static std::vector<std::string>::iterator prepend(
1077
    std::vector<std::string>& container, cm::string_view value,
1078
    EmptyElements emptyElements = EmptyElements::No)
1079
0
  {
1080
0
    return cmList::insert(container, container.cbegin(), value, emptyElements);
1081
0
  }
1082
  static std::vector<std::string>::iterator prepend(
1083
    std::vector<std::string>& container, std::string const& value,
1084
    EmptyElements emptyElements = EmptyElements::No)
1085
0
  {
1086
0
    return cmList::insert(container, container.cbegin(), value, emptyElements);
1087
0
  }
1088
  static std::vector<std::string>::iterator prepend(
1089
    std::vector<std::string>& container, cmValue value,
1090
    EmptyElements emptyElements = EmptyElements::No)
1091
0
  {
1092
0
    if (value) {
1093
0
      return cmList::prepend(container, *value, emptyElements);
1094
0
    }
1095
0
1096
0
    return container.begin();
1097
0
  }
1098
  template <typename InputIterator>
1099
  static std::vector<std::string>::iterator prepend(
1100
    std::vector<std::string>& container, InputIterator first,
1101
    InputIterator last, EmptyElements emptyElements = EmptyElements::No)
1102
  {
1103
    return cmList::insert(container, container.cbegin(), first, last,
1104
                          emptyElements);
1105
  }
1106
1107
  // The following methods offer the possibility to extend a CMake list
1108
  // but without any intermediate expansion. So the operation is simply a
1109
  // string concatenation with special handling for the CMake list item
1110
  // separator
1111
  static std::string& append(std::string& list, std::string&& value);
1112
  static std::string& append(std::string& list, cm::string_view value);
1113
  template <typename InputIterator>
1114
  static std::string& append(std::string& list, InputIterator first,
1115
                             InputIterator last)
1116
0
  {
1117
0
    if (first == last) {
1118
0
      return list;
1119
0
    }
1120
1121
0
    return cmList::append(
1122
0
      list, cmList::Join(first, last, cmList::element_separator));
1123
0
  }
1124
1125
  static std::string& prepend(std::string& list, std::string&& value);
1126
  static std::string& prepend(std::string& list, cm::string_view value);
1127
  template <typename InputIterator>
1128
  static std::string& prepend(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::prepend(
1136
0
      list, cmList::Join(first, last, cmList::element_separator));
1137
0
  }
1138
1139
  template <typename Range,
1140
            cm::enable_if_t<cm::is_range<Range>::value, int> = 0>
1141
  static std::string to_string(Range const& r)
1142
0
  {
1143
0
    return cmList::Join(r, cmList::element_separator);
1144
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_
1145
1146
  // Non-members
1147
  // ===========
1148
  friend bool operator==(cmList const& lhs, cmList const& rhs) noexcept
1149
0
  {
1150
0
    return lhs.Values == rhs.Values;
1151
0
  }
1152
  friend bool operator!=(cmList const& lhs, cmList const& rhs) noexcept
1153
0
  {
1154
0
    return lhs.Values != rhs.Values;
1155
0
  }
1156
1157
private:
1158
  size_type ComputeIndex(index_type pos, bool boundCheck = true) const;
1159
  size_type ComputeInsertIndex(index_type pos, bool boundCheck = true) const;
1160
1161
  cmList GetItems(std::vector<index_type>&& indexes) const;
1162
1163
  cmList& RemoveItems(std::vector<index_type>&& indexes);
1164
  cmList& RemoveItems(std::vector<std::string>&& items);
1165
1166
  static container_type::iterator Insert(container_type& container,
1167
                                         container_type::const_iterator pos,
1168
                                         std::string&& value,
1169
                                         ExpandElements expandElements,
1170
                                         EmptyElements emptyElements);
1171
  static container_type::iterator Insert(container_type& container,
1172
                                         container_type::const_iterator pos,
1173
                                         std::string const& value,
1174
                                         ExpandElements expandElements,
1175
                                         EmptyElements emptyElements)
1176
0
  {
1177
0
    auto tmp = value;
1178
0
    return cmList::Insert(container, pos, std::move(tmp), expandElements,
1179
0
                          emptyElements);
1180
0
  }
1181
  template <typename InputIterator>
1182
  static container_type::iterator Insert(container_type& container,
1183
                                         container_type::const_iterator pos,
1184
                                         InputIterator first,
1185
                                         InputIterator last,
1186
                                         ExpandElements expandElements,
1187
                                         EmptyElements emptyElements)
1188
0
  {
1189
0
    auto delta = std::distance(container.cbegin(), pos);
1190
1191
0
    if (first == last) {
1192
0
      return container.begin() + delta;
1193
0
    }
1194
1195
0
    auto insertPos = container.begin() + delta;
1196
0
    if (expandElements == ExpandElements::Yes) {
1197
0
      for (; first != last; ++first) {
1198
0
        auto size = container.size();
1199
0
        insertPos = cmList::Insert(container, insertPos, *first,
1200
0
                                   expandElements, emptyElements);
1201
0
        insertPos += static_cast<decltype(delta)>(container.size() - size);
1202
0
      }
1203
0
    } else {
1204
0
      for (; first != last; ++first) {
1205
0
        if (!(*first).empty() || emptyElements == EmptyElements::Yes) {
1206
0
          insertPos = container.insert(insertPos, *first);
1207
0
          ++insertPos;
1208
0
        }
1209
0
      }
1210
0
    }
1211
1212
0
    return container.begin() + delta;
1213
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)
1214
1215
0
  static std::string const& ToString(std::string const& s) { return s; }
1216
0
  static std::string ToString(cm::string_view s) { return std::string{ s }; }
1217
  static std::string const& ToString(BT<std::string> const&);
1218
1219
  template <typename Range>
1220
  static std::string Join(Range const& r, cm::string_view glue)
1221
0
  {
1222
0
    if (cm::size(r) == 0) {
1223
0
      return std::string{};
1224
0
    }
1225
1226
0
    return cmList::Join(std::begin(r), std::end(r), glue);
1227
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> >)
1228
  template <typename InputIterator>
1229
  static std::string Join(InputIterator first, InputIterator last,
1230
                          cm::string_view glue)
1231
0
  {
1232
0
    if (first == last) {
1233
0
      return std::string{};
1234
0
    }
1235
1236
0
    auto const sep = std::string{ glue };
1237
1238
0
    std::string joined = cmList::ToString(*first);
1239
0
    for (auto it = std::next(first); it != last; ++it) {
1240
0
      joined += sep;
1241
0
      joined += cmList::ToString(*it);
1242
0
    }
1243
1244
0
    return joined;
1245
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> >)
1246
1247
  container_type Values;
1248
};
1249
1250
// specializations for cmList::TransformSelector allocators
1251
// ========================================================
1252
template <>
1253
inline std::unique_ptr<cmList::TransformSelector>
1254
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1255
  std::initializer_list<index_type> init)
1256
0
{
1257
0
  return cmList::TransformSelector::NewAT(init);
1258
0
}
1259
template <>
1260
inline std::unique_ptr<cmList::TransformSelector>
1261
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1262
  std::vector<index_type> const& init)
1263
0
{
1264
0
  return cmList::TransformSelector::NewAT(init);
1265
0
}
1266
template <>
1267
inline std::unique_ptr<cmList::TransformSelector>
1268
cmList::TransformSelector::New<cmList::TransformSelector::AT>(
1269
  std::vector<index_type>&& init)
1270
0
{
1271
0
  return cmList::TransformSelector::NewAT(std::move(init));
1272
0
}
1273
1274
template <>
1275
inline std::unique_ptr<cmList::TransformSelector>
1276
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1277
  std::initializer_list<index_type> init)
1278
0
{
1279
0
  return cmList::TransformSelector::NewFOR(init);
1280
0
}
1281
template <>
1282
inline std::unique_ptr<cmList::TransformSelector>
1283
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1284
  std::vector<index_type> const& init)
1285
0
{
1286
0
  return cmList::TransformSelector::NewFOR(init);
1287
0
}
1288
template <>
1289
inline std::unique_ptr<cmList::TransformSelector>
1290
cmList::TransformSelector::New<cmList::TransformSelector::FOR>(
1291
  std::vector<index_type>&& init)
1292
0
{
1293
0
  return cmList::TransformSelector::NewFOR(std::move(init));
1294
0
}
1295
1296
template <>
1297
inline std::unique_ptr<cmList::TransformSelector>
1298
cmList::TransformSelector::New<cmList::TransformSelector::REGEX>(
1299
  std::string const& init)
1300
0
{
1301
0
  return cmList::TransformSelector::NewREGEX(init);
1302
0
}
1303
template <>
1304
inline std::unique_ptr<cmList::TransformSelector>
1305
cmList::TransformSelector::New<cmList::TransformSelector::REGEX>(
1306
  std::string&& init)
1307
0
{
1308
0
  return cmList::TransformSelector::NewREGEX(std::move(init));
1309
0
}
1310
1311
// Non-member functions
1312
// ====================
1313
inline std::vector<std::string>& operator+=(std::vector<std::string>& l,
1314
                                            cmList const& r)
1315
0
{
1316
0
  l.insert(l.end(), r.begin(), r.end());
1317
0
  return l;
1318
0
}
1319
inline std::vector<std::string>& operator+=(std::vector<std::string>& l,
1320
                                            cmList&& r)
1321
0
{
1322
0
  std::move(r.begin(), r.end(), std::back_inserter(l));
1323
0
  r.clear();
1324
1325
0
  return l;
1326
0
}
1327
1328
inline void swap(cmList& lhs, cmList& rhs) noexcept
1329
0
{
1330
0
  lhs.swap(rhs);
1331
0
}
1332
1333
namespace cm {
1334
inline void erase(cmList& list, std::string const& value)
1335
0
{
1336
0
  list.erase(std::remove(list.begin(), list.end(), value), list.end());
1337
0
}
1338
1339
template <typename Predicate>
1340
inline void erase_if(cmList& list, Predicate pred)
1341
0
{
1342
0
  list.erase(std::remove_if(list.begin(), list.end(), pred), list.end());
1343
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)
1344
1345
//
1346
// Provide a special implementation of cm::append because, in this case,
1347
// expansion must not be applied to the inserted elements
1348
//
1349
#if defined(__SUNPRO_CC) && defined(__sparc)
1350
// Oracle DeveloperStudio C++ compiler on Solaris/Sparc fails to compile
1351
// templates with constraints.
1352
// So, on this platform, use only simple templates.
1353
template <typename InputIt,
1354
          cm::enable_if_t<cm::is_input_iterator<InputIt>::value, int> = 0>
1355
void append(cmList& v, InputIt first, InputIt last)
1356
{
1357
  v.append(first, last, cmList::ExpandElements::No);
1358
}
1359
1360
template <typename Range,
1361
          cm::enable_if_t<cm::is_input_range<Range>::value, int> = 0>
1362
void append(cmList& v, Range const& r)
1363
{
1364
  v.append(r.begin(), r.end(), cmList::ExpandElements::No);
1365
}
1366
1367
#else
1368
1369
template <
1370
  typename InputIt,
1371
  cm::enable_if_t<
1372
    cm::is_input_iterator<InputIt>::value &&
1373
      std::is_convertible<typename std::iterator_traits<InputIt>::value_type,
1374
                          cmList::value_type>::value,
1375
    int> = 0>
1376
void append(cmList& v, InputIt first, InputIt last)
1377
{
1378
  v.append(first, last, cmList::ExpandElements::No);
1379
}
1380
1381
template <typename Range,
1382
          cm::enable_if_t<cm::is_input_range<Range>::value &&
1383
                            std::is_convertible<typename Range::value_type,
1384
                                                cmList::value_type>::value,
1385
                          int> = 0>
1386
void append(cmList& v, Range const& r)
1387
0
{
1388
0
  v.append(r.begin(), r.end(), cmList::ExpandElements::No);
1389
0
}
1390
#endif
1391
1392
} // namespace cm
1393
1394
/**
1395
 * Helper functions for legacy support. Use preferably cmList class directly
1396
 * or the static methods of the class.
1397
 */
1398
inline void cmExpandList(
1399
  cm::string_view arg, std::vector<std::string>& argsOut,
1400
  cmList::EmptyElements emptyElements = cmList::EmptyElements::No)
1401
14.2k
{
1402
14.2k
  cmList::append(argsOut, arg, emptyElements);
1403
14.2k
}
1404
inline void cmExpandList(
1405
  cmValue arg, std::vector<std::string>& argsOut,
1406
  cmList::EmptyElements emptyElements = cmList::EmptyElements::No)
1407
0
{
1408
0
  cmList::append(argsOut, arg, emptyElements);
1409
0
}