thread_list.h
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. //
  27. // This is an internal list, implemented here because the original uses
  28. // alloc too cumbersomely and breaks the program.
  29. // 
  30. #ifndef __THREADS_LIST
  31. #define __THREADS_LIST
  32. #define _THREAD_SAFE
  33. #include <thread_alloc.h>
  34. #include <iostream.h>
  35. template<class T>
  36. struct _list_node {
  37.   typedef void* void_ptr;
  38.   void_ptr n_next;
  39.   void_ptr n_prev;
  40.   T data;
  41. };
  42. template<class T, class Ref, class Ptr>
  43. struct _list_iterator {
  44.   typedef _list_iterator<T, T&, T*>             iterator;
  45.   typedef _list_iterator<T, const T&, const T*> const_iterator;
  46.   typedef _list_iterator<T, Ref, Ptr>           self;
  47.   typedef T              value_type;
  48.   typedef Ptr            pointer;
  49.   typedef Ref            reference;
  50.   typedef _list_node<T>* link_type;
  51.   link_type i_node;
  52.   _list_iterator(link_type x) : i_node(x) { };
  53.   _list_iterator() { };
  54.   _list_iterator(const iterator& x) : i_node(x.i_node) { };
  55.   bool operator==(const self& x) const { return i_node == x.i_node; };
  56.   bool operator!=(const self& x) const { return i_node != x.i_node; };
  57.   reference operator*() const { return (*i_node).data; };
  58.   self& operator++() {
  59.     i_node = (link_type)((*i_node).n_next);
  60.     return *this;
  61.   }
  62.   self operator++(int) {
  63.     self tmp = *this;
  64.     ++*this;
  65.     return tmp;
  66.   }
  67.   self& operator--() {
  68.     i_node = (link_type)((*i_node).n_next);
  69.     return *this;
  70.   }
  71.   self operator--(int) {
  72.     self tmp = *this;
  73.     --*this;
  74.     return tmp;
  75.   }
  76. };
  77. template<class T, class Alloc = alloc>
  78. class list {
  79.  protected:
  80.   typedef void* void_ptr;
  81.   typedef _list_node<T> list_node;
  82.   typedef simple_alloc<list_node, Alloc> list_node_allocator;
  83.  public:
  84.   typedef T value_type;
  85.   typedef value_type* pointer;
  86.   typedef value_type& reference;
  87.   typedef list_node* link_type;
  88.   typedef _list_iterator<T, T&, T*>             iterator;
  89.   typedef _list_iterator<T, const T&, const T*> const_iterator;
  90.  protected:
  91.   link_type get_node() { return list_node_allocator::allocate(); };
  92.   void put_node(link_type p) { list_node_allocator::deallocate(p); };
  93.   link_type create_node(const T& x) {
  94.     link_type p = get_node();
  95.     try {
  96.       p->data = x;
  97.     }
  98.     catch(...) { put_node(p); throw; };
  99.     return p;
  100.   }
  101.   void destroy_node(link_type p) {
  102.     (&p->data)->~T();
  103.     put_node(p);
  104.   };
  105.   void empty_init() {
  106.     l_head = get_node();
  107.     l_head->n_next = l_head;
  108.     l_head->n_prev = l_head;
  109.   }
  110.  private:
  111.   link_type l_head;
  112.  public:
  113.   list() { empty_init(); }
  114.   ~list() { };
  115.   iterator begin() { return (link_type)((*l_head).n_next); }
  116.   const_iterator begin() const { return (link_type)((l_head).n_next); }
  117.   iterator end() { return l_head; }
  118.   const_iterator end() const { return l_head; }
  119.   bool empty() const { return l_head->n_next == l_head; }
  120.   reference front() { return *begin(); }
  121.   reference back() { return *end(); }
  122.   iterator insert(iterator pos, const T& x) {
  123.     link_type tmp = create_node(x);
  124.     tmp->n_next = pos.i_node;
  125.     tmp->n_prev = pos.i_node->n_prev;
  126.     (link_type(pos.i_node->n_prev))->n_next = tmp;
  127.     pos.i_node->n_prev = tmp;
  128.     return tmp;
  129.   }
  130.   iterator insert(iterator pos) { return insert(pos, T()); }
  131.   iterator find(const T& val) {
  132.     iterator i;
  133.     for(i=begin();i!=end();i++)
  134.       if ((*i) == val)
  135. return i;
  136.     return end();
  137.   }
  138.   void push_front(const T& x) { insert(begin(), x); }
  139.   void push_back(const T& x) { insert(end(), x); }
  140.   iterator erase(iterator pos) {
  141.     link_type nn = link_type(pos.i_node->n_next);
  142.     link_type pn = link_type(pos.i_node->n_prev);
  143.     pn->n_next = nn;
  144.     nn->n_prev = pn;
  145.     destroy_node(pos.i_node);
  146.     return iterator(nn);
  147.   }
  148.   void pop_front() { erase(begin()); }
  149.   void pop_back() {
  150.     iterator tmp = end();
  151.     erase(--tmp);
  152.   }
  153. };
  154. #endif /* __THREAD_LIST */