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