ldc/gen/utils.h
2011-04-20 09:28:37 -06:00

68 lines
1.3 KiB
C++

#ifndef __LDC_GEN_UTILS_H__
#define __LDC_GEN_UTILS_H__
#include "root.h"
/// Very simple templated iterator for DMD ArrayS.
template<class C>
struct ArrayIter
{
Array* array;
size_t index;
ArrayIter(Array& arr, size_t idx = 0)
: array(&arr), index(idx)
{ }
ArrayIter(Array* arr, size_t idx = 0)
: array(arr), index(idx)
{ assert(arr && "null array"); }
ArrayIter<C>& operator=(const Array& arr)
{
array = const_cast<Array*>(&arr);
index = 0;
return *this;
}
ArrayIter<C>& operator=(const Array* arr)
{
assert(arr && "null array");
array = const_cast<Array*>(arr);
index = 0;
return *this;
}
bool done()
{
return index >= array->dim;
}
bool more()
{
return index < array->dim;
}
C* get() {
return static_cast<C*>(array->data[index]);
}
C* operator->() {
return get();
}
C* operator*() {
return get();
}
void next()
{
++index;
}
bool operator==(const ArrayIter<C>& other) {
return &array->data[index] == &other.array->data[other.index];
}
};
// some aliases
typedef ArrayIter<Dsymbol> DsymbolIter;
typedef ArrayIter<FuncDeclaration> FuncDeclarationIter;
typedef ArrayIter<VarDeclaration> VarDeclarationIter;
#endif