_sortseq.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _sortseq.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef _LEDA_SORTSEQ_H
  12. #define _LEDA_SORTSEQ_H
  13. #include <LEDA/sortseq.h>
  14. //------------------------------------------------------------------------------
  15. //
  16. // Sorted sequences with implementation parameter:
  17. //
  18. //   _sortseq<K,I,seq_impl> 
  19. //
  20. //------------------------------------------------------------------------------
  21. /*{Manpage {_sortseq} {K,I,impl} {Sorted Sequences with Implementation Parameter} }*/
  22. /*{Mdefinition
  23. An instance of type name is a sorted sequence implemented by data type
  24. $impl$. $impl$ must be one of the sorted sequence implementations listed in
  25. section ref{Implementations Dictionaries} or a user defined data structure
  26. fulfilling the specification given in section ref{User Implementations
  27. Sorted Sequences}. Note that the key type $K$ must be linearly ordered.
  28. }*/
  29. /*{Mtext
  30. {bf Example}\
  31. Using a sorted sequence implemented by skiplists to list all elements in a 
  32. sequence of strings lying lexicographically between two given search strings.
  33. begingroup
  34. ttbig
  35. {obeyspacesgdef { }}
  36. ttverbatim
  37. #include <LEDA/_sortseq.h>
  38. #include <LEDA/impl/skiplist.h>
  39. main()
  40.  _sortseq<string,int,skiplist> S;
  41.  string s1,s2;
  42.  while ( cin >> s1 &&  s1 != "stop" )  S.insert(s1,0);
  43.  while ( cin >> s1 >> s2 )
  44.  { seq_item start = S.locate(s1);
  45.    seq_item stop  = S.locate(s2);
  46.    for (seq_item it = start; it != stop; it = S.succ(it))
  47.       cout << S.key(it) << endl; 
  48.   }
  49. }
  50. endgroup
  51. }*/
  52. template <class K, class I, class impl> 
  53. class _sortseq : private virtual impl, public sortseq<K,I>
  54. {
  55. int  int_type()              const { return LEDA_INT_TYPE(K); }
  56. int  cmp(GenPtr x, GenPtr y) const { return LEDA_COMPARE(K,x,y); }
  57. void clear_key(GenPtr& x)    const { LEDA_CLEAR(K,x); }
  58. void clear_inf(GenPtr& x)    const { LEDA_CLEAR(I,x); }
  59. void copy_key(GenPtr& x)     const { LEDA_COPY(K,x); }
  60. void copy_inf(GenPtr& x)     const { LEDA_COPY(I,x); }
  61. void print_key(GenPtr x)     const { LEDA_PRINT(K,x,cout); }
  62. void print_inf(GenPtr x)     const { LEDA_PRINT(I,x,cout); }
  63. public:
  64. K key(seq_item it) const { return LEDA_ACCESS(K,impl::key(impl::item(it))); }
  65. I inf(seq_item it) const { return LEDA_ACCESS(I,impl::inf(impl::item(it))); }
  66. seq_item lookup(K y) const { return (seq_item)impl::lookup(Convert(y)); }
  67. seq_item locate(K y) const { return (seq_item)impl::locate(Convert(y)); }
  68. seq_item locate_succ(K y) const 
  69. { return (seq_item)impl::locate_succ(Convert(y)); }
  70. seq_item locate_pred(K y) const 
  71. { return (seq_item)impl::locate_pred(Convert(y)); }
  72. seq_item min() const { return (seq_item)impl::min(); }
  73. seq_item max() const { return (seq_item)impl::max(); }
  74. seq_item succ(seq_item x) const { return (seq_item)impl::succ(impl::item(x)); }
  75. seq_item succ(K y) const { return locate_succ(y); }
  76. seq_item pred(seq_item x) const { return (seq_item)impl::pred(impl::item(x)); }
  77. seq_item pred(K y) const { return locate_pred(y); }
  78. seq_item insert(K y,I x)
  79. { return (seq_item)impl::insert(Convert(y),Convert(x));}
  80. seq_item insert_at(seq_item it,K y,I x)
  81. { return (seq_item)impl::insert_at_item(impl::item(it),Convert(y),Convert(x));}
  82. void reverse_items(seq_item it1, seq_item it2) 
  83. { impl::reverse_items(impl::item(it1),impl::item(it2)); }
  84. void flip_items(seq_item it1, seq_item it2) { reverse_items(it1,it2); }
  85. void del(K y) { impl::del(Convert(y)); }
  86. void del_item(seq_item it) { impl::del_item(impl::item(it)); }
  87. void change_inf(seq_item it, I i) 
  88. { impl::change_inf(impl::item(it),Convert(i));}
  89. int  size()  const { return impl::size(); }
  90. bool empty() const { return (size()==0) ? true : false; }
  91. void clear() { impl::clear(); }
  92. void split(seq_item it,sortseq<K,I>& S1,sortseq<K,I>& S2)
  93. { impl::split_at_item(impl::item(it),*(impl*)&S1,*(impl*)&S2); }
  94. sortseq<K,I>& conc(sortseq<K,I>& S)
  95. { impl::conc(*(impl*)&S); return *this; }
  96.  _sortseq() {}
  97.  _sortseq(const _sortseq<K,I,impl>& S) : impl(S) {}
  98.  _sortseq<K,I,impl>& operator=(const _sortseq<K,I,impl>& S)
  99.  { impl::operator=(S); return *this; }
  100. ~_sortseq() { impl::clear(); }
  101. };
  102. #endif