mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-20 12:31:40 +00:00
Re-landing "Refactoring cl::list_storage from "is a" to "has a" std::vector."
Originally landed r238485 MSVC resolves identifiers differently from Clang and GCC, this resulted in build bot failures. This pach re-lands r238485 and fixes the build failures. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238505 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
81f64c04d7
commit
d9f97d149f
@ -1284,24 +1284,69 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Define how to hold a class type object, such as a string. Since we can
|
// Define how to hold a class type object, such as a string.
|
||||||
// inherit from a class, we do so. This makes us exactly compatible with the
|
// Originally this code inherited from std::vector. In transitioning to a new
|
||||||
// object in all cases that it is used.
|
// API for command line options we should change this. The new implementation
|
||||||
|
// of this list_storage specialization implements the minimum subset of the
|
||||||
|
// std::vector API required for all the current clients.
|
||||||
//
|
//
|
||||||
template <class DataType>
|
// FIXME: Reduce this API to a more narrow subset of std::vector
|
||||||
class list_storage<DataType, bool> : public std::vector<DataType> {
|
//
|
||||||
|
template <class DataType> class list_storage<DataType, bool> {
|
||||||
|
std::vector<DataType> Storage;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <class T> void addValue(const T &V) {
|
typedef typename std::vector<DataType>::iterator iterator;
|
||||||
std::vector<DataType>::push_back(V);
|
|
||||||
|
iterator begin() { return Storage.begin(); }
|
||||||
|
iterator end() { return Storage.end(); }
|
||||||
|
|
||||||
|
typedef typename std::vector<DataType>::const_iterator const_iterator;
|
||||||
|
const_iterator begin() const { return Storage.begin(); }
|
||||||
|
const_iterator end() const { return Storage.end(); }
|
||||||
|
|
||||||
|
typedef typename std::vector<DataType>::size_type size_type;
|
||||||
|
size_type size() const { return Storage.size(); }
|
||||||
|
|
||||||
|
bool empty() const { return Storage.empty(); }
|
||||||
|
|
||||||
|
void push_back(const DataType &value) { Storage.push_back(value); }
|
||||||
|
void push_back(DataType &&value) { Storage.push_back(value); }
|
||||||
|
|
||||||
|
typedef typename std::vector<DataType>::reference reference;
|
||||||
|
typedef typename std::vector<DataType>::const_reference const_reference;
|
||||||
|
reference operator[](size_type pos) { return Storage[pos]; }
|
||||||
|
const_reference operator[](size_type pos) const { return Storage[pos]; }
|
||||||
|
|
||||||
|
iterator erase(const_iterator pos) { return Storage.erase(pos); }
|
||||||
|
iterator erase(const_iterator first, const_iterator last) {
|
||||||
|
return Storage.erase(first, last);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iterator insert(const_iterator pos, const DataType &value) {
|
||||||
|
return Storage.insert(pos, value);
|
||||||
|
}
|
||||||
|
iterator insert(const_iterator pos, DataType &&value) {
|
||||||
|
return Storage.insert(pos, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
reference front() { return Storage.front(); }
|
||||||
|
const_reference front() const { return Storage.front(); }
|
||||||
|
|
||||||
|
operator std::vector<DataType>&() { return Storage; }
|
||||||
|
operator ArrayRef<DataType>() { return Storage; }
|
||||||
|
std::vector<DataType> *operator&() { return &Storage; }
|
||||||
|
const std::vector<DataType> *operator&() const { return &Storage; }
|
||||||
|
|
||||||
|
template <class T> void addValue(const T &V) { Storage.push_back(V); }
|
||||||
};
|
};
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// list - A list of command line options.
|
// list - A list of command line options.
|
||||||
//
|
//
|
||||||
template <class DataType, class Storage = bool,
|
template <class DataType, class StorageClass = bool,
|
||||||
class ParserClass = parser<DataType>>
|
class ParserClass = parser<DataType>>
|
||||||
class list : public Option, public list_storage<DataType, Storage> {
|
class list : public Option, public list_storage<DataType, StorageClass> {
|
||||||
std::vector<unsigned> Positions;
|
std::vector<unsigned> Positions;
|
||||||
ParserClass Parser;
|
ParserClass Parser;
|
||||||
|
|
||||||
@ -1319,7 +1364,7 @@ class list : public Option, public list_storage<DataType, Storage> {
|
|||||||
typename ParserClass::parser_data_type();
|
typename ParserClass::parser_data_type();
|
||||||
if (Parser.parse(*this, ArgName, Arg, Val))
|
if (Parser.parse(*this, ArgName, Arg, Val))
|
||||||
return true; // Parse Error!
|
return true; // Parse Error!
|
||||||
list_storage<DataType, Storage>::addValue(Val);
|
list_storage<DataType, StorageClass>::addValue(Val);
|
||||||
setPosition(pos);
|
setPosition(pos);
|
||||||
Positions.push_back(pos);
|
Positions.push_back(pos);
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user