template <typename T>
class ImmutableListImpl : public FoldingSetNode {
T Head;
- ImmutableListImpl* Tail;
+ const ImmutableListImpl* Tail;
- ImmutableListImpl(const T& head, ImmutableListImpl* tail = 0)
+ ImmutableListImpl(const T& head, const ImmutableListImpl* tail = 0)
: Head(head), Tail(tail) {}
friend class ImmutableListFactory<T>;
public:
const T& getHead() const { return Head; }
- ImmutableListImpl* getTail() const { return Tail; }
+ const ImmutableListImpl* getTail() const { return Tail; }
static inline void Profile(FoldingSetNodeID& ID, const T& H,
- ImmutableListImpl* L){
+ const ImmutableListImpl* L){
ID.AddPointer(L);
ID.Add(H);
}
typedef ImmutableListFactory<T> Factory;
private:
- ImmutableListImpl<T>* X;
+ const ImmutableListImpl<T>* X;
public:
// This constructor should normally only be called by ImmutableListFactory<T>.
// There may be cases, however, when one needs to extract the internal pointer
// and reconstruct a list object from that pointer.
- ImmutableList(ImmutableListImpl<T>* x = 0) : X(x) {}
+ ImmutableList(const ImmutableListImpl<T>* x = 0) : X(x) {}
- ImmutableListImpl<T>* getInternalPointer() const {
+ const ImmutableListImpl<T>* getInternalPointer() const {
return X;
}
class iterator {
- ImmutableListImpl<T>* L;
+ const ImmutableListImpl<T>* L;
public:
iterator() : L(0) {}
iterator(ImmutableList l) : L(l.getInternalPointer()) {}
FoldingSetNodeID ID;
void* InsertPos;
- ListTy* TailImpl = Tail.getInternalPointer();
+ const ListTy* TailImpl = Tail.getInternalPointer();
ListTy::Profile(ID, Head, TailImpl);
ListTy* L = Cache.FindNodeOrInsertPos(ID, InsertPos);