⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p1989.c

📁 linux下编程用 编译软件
💻 C
字号:
// { dg-do assemble  }// prms-id: 1989#define TRUE true#define FALSE falsetypedef void *Pix;template<class T>struct link {    T item;    link *next;    link *prev;    link(const T& t): item(t), prev(0), next(0)	{ };    link(const T& t, link<T> *p, link<T> *n): item(t), prev(p), next(n)	{ };};template<class T>class List_DL {public:    List_DL();    List_DL(const List_DL&);    ~List_DL();    void append(const T& item);    void prepend(const T& item);    void insert(const T& item, Pix x, bool before);    void remove(Pix& x)	{ T tmp; remove(x, tmp); }    void remove(Pix& x, T& item);    void clear();    unsigned length() const	{ return count; }private:    unsigned count;    link<T> *head;    link<T> *tail;public:    Pix first() const	{ return Pix(head); }    Pix last() const	{ return Pix(tail); }    void next(Pix& x) const	{ if (0 != x) x = ((link<T> *) x)->next; }    void prev(Pix& x) const	{ if (0 != x) x = ((link<T> *) x)->prev; }    T& operator()(Pix x) const	{ return ((link<T> *) x)->item; }};template<class T>List_DL<T>::List_DL():count(0),head(0){ }template<class T>List_DL<T>::List_DL(const List_DL& other):count(0),head(0){    for (Pix x=other.first(); 0 != x; other.next(x))	append(other(x));}template<class T>List_DL<T>::~List_DL(){    clear();}template<class T>voidList_DL<T>::append(const T& item){    count++;    if (0 == head) {	head = new link<T>(item);	tail = head;    } else {	tail->next = new link<T>(item, tail, 0);	tail = tail->next;    }}template<class T>voidList_DL<T>::prepend(const T& item){    count++;    if (0 == head) {	head = new link<T>(item);	tail = head;    } else {	head = new link<T>(item, 0, head);	if (tail == head)	    tail = tail->next;    }}template<class T>voidList_DL<T>::insert(const T& item, Pix x, bool before = TRUE){    link<T> *l = (link<T> *) x;    if (before) {	if (0 == l || l == head) {	    prepend(item);	} else {	    link<T> *n = new link<T>(item, l->prev, l);	    l->prev->next = n;	    l->prev = n;	}    } else {	if (0 == l || l == tail) {	    append(item);	} else {	    link<T> *n = new link<T>(item, l, l->next);	    l->next->prev = n;	    l->prev = n;	}    }}template<class T>voidList_DL<T>::remove(Pix& x, T& item){    link<T> *l = (link<T> *) x;    if (0 == l)	return;    item = l->item;    if (1 == count) {	delete head;	head = 0;	tail = 0;    } else {	// more than one item in the list	if (l == head) {	    link<T> *old = head;	    head = head->next;	    head->prev = 0;	    delete old;	} else if (l == tail) {	    link<T> *old = tail;	    tail = tail->prev;	    tail->next = 0;	    delete old;	} else {	    l->next->prev = l->prev;	    l->prev->next = l->next;	    delete l;	}    }}template<class T>voidList_DL<T>::clear(){    link<T> *l, *succ;    for (l=head; 0 != l; l=succ) {	succ = l->next;	delete l;    }    head = 0;    tail = 0;}template<class T>class List_DLS: public List_DL<T> {public:    List_DLS(): List_DL<T>()	{ };    List_DLS(const List_DLS& other): List_DL<T>(other)	{ };    bool contains(const T& item) const	{ return search(item) != 0 ? TRUE: FALSE; }    Pix search(const T&) const;};template<class T>PixList_DLS<T>::search(const T& item) const{    for (Pix x=this->first(); 0 != x; this->next(x)) {	if (item == this->operator()(x)) // { dg-error "" } const subversion	    return x;    }    return 0;}template<class T>class List_DLSp: public List_DL<T> {public:    List_DLSp(): List_DL<T>()	{ };    List_DLSp(const List_DLSp& other): List_DL<T>(other)	{ };    bool contains(const T& item) const#ifndef INTERNAL_ERROR	;#else	{ return search(item) != 0 ? TRUE: FALSE; }#endif    Pix search(const T&) const;};template<class T>boolList_DLSp<T>::contains(const T& item) const{    for (Pix x=this->first(); 0 != x; this->next(x)) {        if (*item == *(this->operator()(x)))	    return TRUE;    }    return FALSE;}template<class T>class Set {public:    Set();    Set(const Set& other);    virtual void add(const T& item);    void remove(const T& item)	{ Pix x = search(item); remove(x); }    void remove(Pix& x)	{ T tmp; remove(x, tmp); }    virtual void remove(Pix& x, T& item);    virtual void clear();    virtual bool contains(const T&) const;    virtual Pix search(const T&) const;    virtual unsigned length() const;    virtual Pix first() const;    virtual void next(Pix& x) const;    virtual T& operator()(Pix x) const;};template<class T>Set<T>::Set(){ }template<class T>Set<T>::Set(const Set& other){ }template<class T>class Set_DL: public List_DLS<T> {public:    Set_DL();    Set_DL(const Set_DL& other);    void add(const T& item)	{ list.append(item); }    void remove(Pix& x, T& item)	{ list.remove(x, item); }    void clear()	{ list.clear(); }    bool contains(const T& item) const	{ return list.contains(item); }    Pix search(const T& item) const	{ return list.search(item); }    unsigned length() const	{ return list.length(); }    Pix first() const	{ return list.first(); }    void next(Pix& x) const	{ list.next(x); }    T& operator()(Pix x) const	{ return list(x); }private:    List_DLS<T> list;};template<class T>class Set_DLp: public List_DLSp<T> {public:    Set_DLp();    Set_DLp(const Set_DLp& other);    void add(const T& item)	{ list.append(item); }    void remove(Pix& x, T& item)	{ list.remove(x, item); }    void clear()	{ list.clear(); }    bool contains(const T& item) const	{ return list.contains(item); }    Pix search(const T& item) const	{ return list.search(item); }    unsigned length() const	{ return list.length(); }    Pix first() const	{ return list.first(); }    void next(Pix& x) const	{ list.next(x); }    T& operator()(Pix x) const	{ return list(x); }private:    List_DLSp<T> list;};template<class T>struct vertex {    T item;    List_DL<vertex<T> *> fanout;    vertex(): item(), fanout()	// { dg-bogus "" }       { };    vertex(const T& i): item(), fanout() // { dg-bogus "" }       { };};template<class T>class Graph {public:    Graph();    Graph(const Graph&);    ~Graph();    void add(const T& from, const T& to);    bool contains(const T& from, const T& to) const;    void clear()	{ vertices.clear(); }    unsigned lengthV() const	{ return vertices.length(); }    Pix firstV() const	{ return vertices.first(); }    void nextV(Pix& x) const	{ vertices.next(x); }    T& V(Pix x) const	{ return vertices(x).item; }    Pix firstV1(Pix vx) const;    void nextV1(Pix vx, Pix& x) const;    T& V1(Pix vx, Pix x) const;private:    vertex<T> *lookup(const T& from) const;    vertex<T> *lookup_new(const T& from);    List_DLS<vertex<T> > vertices;};template<class T>Graph<T>::Graph():vertices(){ }template<class T>Graph<T>::Graph(const Graph& other):vertices(){    for (Pix vx=firstV(); 0 != vx; nextV(vx)) {	for (Pix vx1=firstV1(vx); 0 != vx1; nextV1(vx, vx1)) {	    add(V(vx), V1(vx, vx1));	}    }}template<class T>Graph<T>::~Graph(){    clear();}template<class T>voidGraph<T>::add(const T& from, const T& to){    vertex<T> *fromv = lookup_new(from);    if (from == to)	return;    vertex<T> *tov = lookup_new(to);    fromv->fanout.append(tov);}template<class T>boolGraph<T>::contains(const T& from, const T& to) const{    vertex<T> *fromv = lookup(from);    if (0 == fromv)	return FALSE;    for (Pix x=fromv->fanout.first(); 0 != x; fromv->fanout.next(x)) {	if (fromv->fanout(x)->item == to)	    return TRUE;    }    return FALSE;}template<class T>vertex<T> *Graph<T>::lookup(const T& from) const{    for (Pix x=vertices.first(); 0 != x; vertices.next(x)) {	if (vertices(x).item == from)	    return &vertices(x);    }    return 0;}template<class T>vertex<T> *Graph<T>::lookup_new(const T& from){    vertex<T> *v = lookup(from);    if (0 == v) {	vertices.append(from);	return &vertices(vertices.last());    }    return v;}template<class T>PixGraph<T>::firstV1(Pix vx) const{    vertex<T> *v = (vertex<T> *) vx;    return v->fanout.first();}template<class T>voidGraph<T>::nextV1(Pix vx, Pix& x) const{    vertex<T> *v = (vertex<T> *) vx;    return v->fanout.next(x);}template<class T>T&Graph<T>::V1(Pix vx, Pix x) const{    vertex<T> *v = (vertex<T> *) vx;    static T x1;    return x1;}class STRLIdentifier;extern int x(List_DL<STRLIdentifier *>);extern int x(List_DLS<STRLIdentifier *>);extern int x(Set<STRLIdentifier *>);extern int x(Set_DL<STRLIdentifier *>);extern int x(Set_DLp<STRLIdentifier *>);extern int x(Graph<STRLIdentifier *>);class STRLIdentifier {    char buf[10];};extern int operator==(vertex<STRLIdentifier*>&, vertex<STRLIdentifier*>&); // { dg-error "" } const subversionextern int operator==(STRLIdentifier&, STRLIdentifier&); // { dg-error "" } fn ref in err msgextern int x(List_DLSp<STRLIdentifier *>);template class Graph<STRLIdentifier *>;template class List_DLS<vertex<STRLIdentifier *> >;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -