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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  gen_array.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_GEN_ARRAY_H
  12. #define LEDA_GEN_ARRAY_H
  13. //------------------------------------------------------------------------------
  14. // arrays
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. class gen_array {
  18. friend class gen_array2;
  19. protected:
  20. GenPtr* v;
  21. GenPtr* last;
  22. int sz;
  23.         int Low;
  24.         int High;
  25. virtual int  cmp(GenPtr, GenPtr)  const { return 0; }
  26. virtual void print_el(GenPtr&,ostream&) const {}
  27. virtual void read_el(GenPtr& ,istream&) const {}
  28. virtual void clear_entry(GenPtr&) const {}
  29. virtual void copy_entry(GenPtr&)  const {}
  30. virtual void init_entry(GenPtr&)  const {}
  31. virtual int  int_type() const { return 0; }
  32.   void quick_sort(GenPtr*,GenPtr*);
  33.   void int_quick_sort(GenPtr*,GenPtr*);
  34.   void insertion_sort(GenPtr*,GenPtr*,GenPtr*);
  35.   void int_insertion_sort(GenPtr*,GenPtr*,GenPtr*);
  36. protected:
  37.   int  binary_search(GenPtr);
  38.   void sort(int,int); 
  39.   void init();
  40.   void clear();
  41. public:
  42.          gen_array();
  43.          gen_array(int);
  44.          gen_array(int, int);
  45.          gen_array(const gen_array&);
  46. virtual ~gen_array() { if (v) delete[] v; }
  47.    gen_array& operator=(const gen_array&);
  48.    int     size() const     { return sz; }
  49.    int     low()  const     { return Low; }
  50.    int     high() const     { return High; }
  51.    GenPtr& elem(int i)       { return v[i]; }
  52.    GenPtr  elem(int i) const { return v[i]; }
  53.    GenPtr& entry(int i)
  54.    { if (i<Low || i>High)
  55.      error_handler(2,"array::entry index out of range");
  56.      return v[i-Low];
  57.     }
  58.    GenPtr  inf(int i) const
  59.    { if (i<Low || i>High)
  60.      error_handler(2,"array::inf index out of range");
  61.      return v[i-Low];
  62.     }
  63.    void permute(int,int);
  64.    void permute()  { permute(Low,High); }
  65.    void print(ostream&,string, char space) const;    
  66.    void print(ostream& out,char space=' ') const { print(out,"",space);  }
  67.    void print(string s, char space=' ')    const { print(cout,s,space);  }
  68.    void print(char space=' ')              const { print(cout,"",space); }   
  69.    void read(istream&,string);  
  70.    void read(istream& in)      { read(in,"");  }
  71.    void read(string s )        { read(cin,s);  }   
  72.    void read()                 { read(cin,""); }   
  73. // Iteration
  74.    GenPtr first_item() { return v; }
  75.    GenPtr last_item()  { return last; }
  76.    void loop_to_succ(GenPtr& p) { p = (p == last) ? 0 : (GenPtr*)p + 1;}
  77.    void loop_to_pred(GenPtr& p) { p = (p == v)    ? 0 : (GenPtr*)p - 1;}
  78. #if defined(__ELSE_SCOPE_BUG__)
  79.    GenPtr* forall_loop_item;
  80.    GenPtr& Forall_Loop_Item() const { return *(GenPtr*)&forall_loop_item; }
  81. #endif
  82. };
  83. /*------------------------------------------------------------------------*/
  84. /* 2 dimensional arrays                                                   */
  85. /*------------------------------------------------------------------------*/
  86. class gen_array2 {
  87. gen_array A;
  88. int Low1, Low2, High1, High2;
  89. virtual void clear_entry(GenPtr& x) const { x = 0; }
  90. virtual void copy_entry(GenPtr& x)  const { x = 0; }
  91. virtual void init_entry(GenPtr& x)  const { x = 0; }
  92. protected:
  93. void clear();
  94. gen_array* row(int i) const { return (gen_array*)A.inf(i); }
  95. void copy_row(gen_array*, gen_array*) const;
  96. public:
  97. void init(int,int,int,int);
  98. int low1()  const { return Low1; }
  99. int low2()  const { return Low2; }
  100. int high1() const { return High1; }
  101. int high2() const { return High2; }
  102. gen_array2(int,int,int,int);
  103. gen_array2(int,int);
  104. virtual ~gen_array2();
  105. gen_array2(const gen_array2& a);
  106. gen_array2& operator=(const gen_array2& a);
  107. };
  108. #if !defined(__TEMPLATE_FUNCTIONS__)
  109. // default I/O and cmp functions
  110. inline void Print(const gen_array& A, ostream& out) { A.print(out); }
  111. inline void Read(gen_array& A, istream& in) { A.read(in); }
  112. inline int compare(const gen_array&,const gen_array&) { return 0; }
  113. #endif
  114. #endif