// { dg-do assemble }
|
// { dg-do assemble }
|
// GROUPS passed scope pt
|
// GROUPS passed scope pt
|
class Link {
|
class Link {
|
public:
|
public:
|
Link();
|
Link();
|
Link(Link *);
|
Link(Link *);
|
private:
|
private:
|
Link *next_;
|
Link *next_;
|
|
|
friend class IListBase;
|
friend class IListBase;
|
friend class IListIterBase;
|
friend class IListIterBase;
|
};
|
};
|
|
|
inline
|
inline
|
Link::Link() : next_(0)
|
Link::Link() : next_(0)
|
{
|
{
|
}
|
}
|
|
|
inline
|
inline
|
Link::Link(Link *next) : next_(next)
|
Link::Link(Link *next) : next_(next)
|
{
|
{
|
}
|
}
|
|
|
class IListBase {
|
class IListBase {
|
public:
|
public:
|
IListBase();
|
IListBase();
|
IListBase(Link *);
|
IListBase(Link *);
|
void append(Link *);
|
void append(Link *);
|
void insert(Link *);
|
void insert(Link *);
|
Link *head();
|
Link *head();
|
int empty();
|
int empty();
|
Link *get();
|
Link *get();
|
void remove(Link *);
|
void remove(Link *);
|
private:
|
private:
|
Link *head_;
|
Link *head_;
|
friend class IListIterBase;
|
friend class IListIterBase;
|
};
|
};
|
|
|
inline
|
inline
|
IListBase::IListBase() : head_(0)
|
IListBase::IListBase() : head_(0)
|
{
|
{
|
}
|
}
|
|
|
inline
|
inline
|
IListBase::IListBase(Link *head) : head_(head)
|
IListBase::IListBase(Link *head) : head_(head)
|
{
|
{
|
}
|
}
|
|
|
inline
|
inline
|
void IListBase::insert(Link *p)
|
void IListBase::insert(Link *p)
|
{
|
{
|
p->next_ = head_;
|
p->next_ = head_;
|
head_ = p;
|
head_ = p;
|
}
|
}
|
|
|
inline
|
inline
|
Link *IListBase::head()
|
Link *IListBase::head()
|
{
|
{
|
return head_;
|
return head_;
|
}
|
}
|
|
|
inline
|
inline
|
int IListBase::empty()
|
int IListBase::empty()
|
{
|
{
|
return head_ == 0;
|
return head_ == 0;
|
}
|
}
|
|
|
inline
|
inline
|
Link *IListBase::get()
|
Link *IListBase::get()
|
{
|
{
|
Link *tem = head_;
|
Link *tem = head_;
|
head_ = head_->next_;
|
head_ = head_->next_;
|
return tem;
|
return tem;
|
}
|
}
|
|
|
template class IListIter;
|
template class IListIter;
|
|
|
template
|
template
|
class IList : private IListBase {
|
class IList : private IListBase {
|
public:
|
public:
|
IList() { }
|
IList() { }
|
IList(T *p) : IListBase(p) { }
|
IList(T *p) : IListBase(p) { }
|
~IList();
|
~IList();
|
void append(T *p) { IListBase::append(p); }
|
void append(T *p) { IListBase::append(p); }
|
void insert(T *p) { IListBase::insert(p); }
|
void insert(T *p) { IListBase::insert(p); }
|
void remove(T *p) { IListBase::remove(p); }
|
void remove(T *p) { IListBase::remove(p); }
|
T *head() { return (T *)IListBase::head(); }
|
T *head() { return (T *)IListBase::head(); }
|
T *get() { return (T *)IListBase::get(); }
|
T *get() { return (T *)IListBase::get(); }
|
IListBase::empty;
|
IListBase::empty;
|
friend class IListIter;
|
friend class IListIter;
|
};
|
};
|
|
|
template
|
template
|
IList::~IList()
|
IList::~IList()
|
{
|
{
|
while (!empty())
|
while (!empty())
|
delete get();
|
delete get();
|
}
|
}
|
|
|
class IListIterBase {
|
class IListIterBase {
|
public:
|
public:
|
IListIterBase(const IListBase &);
|
IListIterBase(const IListBase &);
|
int done();
|
int done();
|
Link *cur();
|
Link *cur();
|
void next();
|
void next();
|
private:
|
private:
|
Link *p_;
|
Link *p_;
|
};
|
};
|
|
|
inline
|
inline
|
IListIterBase::IListIterBase(const IListBase &list) : p_(list.head_)
|
IListIterBase::IListIterBase(const IListBase &list) : p_(list.head_)
|
{
|
{
|
}
|
}
|
|
|
inline
|
inline
|
int IListIterBase::done()
|
int IListIterBase::done()
|
{
|
{
|
return p_ == 0;
|
return p_ == 0;
|
}
|
}
|
|
|
inline
|
inline
|
Link *IListIterBase::cur()
|
Link *IListIterBase::cur()
|
{
|
{
|
return p_;
|
return p_;
|
}
|
}
|
|
|
inline
|
inline
|
void IListIterBase::next()
|
void IListIterBase::next()
|
{
|
{
|
p_ = p_->next_;
|
p_ = p_->next_;
|
}
|
}
|
|
|
|
|
template
|
template
|
class IListIter : private IListIterBase {
|
class IListIter : private IListIterBase {
|
public:
|
public:
|
IListIter(const IList &list) : IListIterBase(list) { }
|
IListIter(const IList &list) : IListIterBase(list) { }
|
T *cur() { return (T *)IListIterBase::cur(); }
|
T *cur() { return (T *)IListIterBase::cur(); }
|
IListIterBase::next;
|
IListIterBase::next;
|
IListIterBase::done;
|
IListIterBase::done;
|
};
|
};
|
|
|
|
|
struct A {
|
struct A {
|
IList list;
|
IList list;
|
int x;
|
int x;
|
void foo();
|
void foo();
|
};
|
};
|
|
|
|
|
void A::foo()
|
void A::foo()
|
{
|
{
|
for (IListIter iter(list); !iter.done(); iter.next())
|
for (IListIter iter(list); !iter.done(); iter.next())
|
;
|
;
|
x = 0;
|
x = 0;
|
}
|
}
|
|
|