1 /* 2 * delta-table.h: Part of GNU CSSC. 3 * 4 * 5 * Copyright (C) 1997, 1999, 2007, 2008, 2009, 2010, 2011, 2014, 2019 6 * Free Software Foundation, Inc. 7 * 8 * This program is free software: you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation, either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 20 * 21 * 22 * Definition of the classes cssc_delta_table and delta_iterator. 23 */ 24 25 26 #ifndef CSSC_DELTA_TABLE_H 27 #define CSSC_DELTA_TABLE_H 1 28 29 #include <deque> 30 #include <vector> 31 #include <map> 32 33 #include "delta.h" 34 35 class stl_delta_list 36 { 37 seq_no high_seqno; 38 sid high_release; 39 std::vector<struct delta> items; 40 std::map<seq_no, size_t> seq_table; 41 42 protected: update_highest(const delta & d)43 void update_highest(const delta& d) 44 { 45 if (d.seq() > high_seqno) 46 high_seqno = d.seq(); 47 48 if (!d.removed()) 49 { 50 if (high_release.is_null()) 51 { 52 if (d.id().on_trunk()) 53 high_release = d.id(); 54 } 55 else if (d.id() > high_release) 56 { 57 high_release = d.id(); 58 } 59 } 60 } 61 62 63 public: 64 typedef std::vector<struct delta>::size_type size_type; 65 stl_delta_list()66 stl_delta_list() 67 : high_seqno(0), 68 high_release(sid::null_sid()) 69 { 70 } 71 get_high_seqno()72 seq_no get_high_seqno() const 73 { 74 return high_seqno; 75 } 76 get_high_release()77 const sid& get_high_release() const 78 { 79 return high_release; 80 } 81 length()82 size_type length() const 83 { 84 return items.size(); 85 } 86 select(size_type i)87 const delta& select(size_type i) const 88 { 89 return items[i]; 90 } 91 select(size_type i)92 delta& select(size_type i) 93 { 94 return items[i]; 95 } 96 add(const delta & d)97 void add(const delta& d) 98 { 99 size_t pos = items.size(); 100 items.push_back(d); 101 seq_table[d.seq()] = pos; 102 update_highest(d); 103 } 104 105 stl_delta_list& operator += (const stl_delta_list& other) 106 { 107 for (size_type i=0; i<other.length(); ++i) 108 { 109 add(other.select(i)); 110 } 111 return *this; 112 } 113 delta_at_seq_exists(seq_no seq)114 bool delta_at_seq_exists(seq_no seq) 115 { 116 std::map<seq_no, size_t>::const_iterator i = seq_table.find(seq); 117 return i != seq_table.end(); 118 } 119 delta_at_seq(seq_no seq)120 const delta& delta_at_seq(seq_no seq) 121 { 122 std::map<seq_no, size_t>::const_iterator i = seq_table.find(seq); 123 ASSERT (i != seq_table.end()); 124 return items[i->second]; 125 } 126 }; 127 128 129 class cssc_delta_table 130 { 131 typedef stl_delta_list delta_list; 132 delta_list l; 133 134 cssc_delta_table &operator =(cssc_delta_table const &); /* undefined */ 135 cssc_delta_table(cssc_delta_table const &); /* undefined */ 136 137 public: 138 typedef stl_delta_list::size_type size_type; 139 cssc_delta_table()140 cssc_delta_table() 141 { 142 } 143 144 void add(const delta &d); 145 void prepend(const delta &); /* sf-add.c */ 146 147 // These two methods should b const, but are not because they 148 // call build_seq_table(). 149 bool delta_at_seq_exists(seq_no seq); 150 const delta & delta_at_seq(seq_no seq); 151 152 const delta *find(sid id) const; 153 const delta *find_any(sid id) const; // includes removed deltas. 154 delta *find(sid id); 155 highest_seqno()156 seq_no highest_seqno() const { return l.get_high_seqno(); } 157 seq_no next_seqno() const; highest_release()158 sid highest_release() const { return l.get_high_release(); } 159 length()160 size_type length() const { return l.length(); } 161 select(size_type pos)162 const delta& select(size_type pos) const { return l.select(pos); } select(size_type pos)163 delta& select(size_type pos) { return l.select(pos); } 164 165 ~cssc_delta_table(); 166 }; 167 168 169 #endif /* CSSC_DELTA_TABLE_H */ 170 171 /* Local variables: */ 172 /* mode: c++ */ 173 /* End: */ 174