@@ -52,25 +52,34 @@ namespace Sass {
52
52
if (!childless) elements_ = std::move (vec);
53
53
}
54
54
55
- // Allow destructor overloading
56
- // virtual ~Vectorized() {};
57
-
58
55
// Some simple method delegations
59
- T& last () { return elements_.back (); }
60
- T& first () { return elements_.front (); }
61
- const T& last () const { return elements_.back (); }
62
- const T& first () const { return elements_.front (); }
63
- bool empty () const { return elements_.empty (); }
64
56
void clear () { return elements_.clear (); }
65
57
size_t size () const { return elements_.size (); }
58
+ bool empty () const { return elements_.empty (); }
59
+ const T& at (size_t i) const { return elements_.at (i); }
60
+ const T& get (size_t i) const { return elements_[i]; }
61
+ const T& last () const { return elements_.back (); }
62
+ const T& first () const { return elements_.front (); }
63
+
64
+ // Setter to ensure we reset hash value
65
+ void set (size_t i, const T& value) {
66
+ hash_ = 0 ; // reset hash
67
+ elements_.at (i) = value;
68
+ }
69
+
70
+ // Setter to ensure we reset hash value
71
+ void set_last (const T& value) {
72
+ hash_ = 0 ; // reset hash
73
+ elements_.back () = value;
74
+ }
66
75
67
76
// Check underlying containers for equality
68
- // Note: maybe we could gain some speed by checking
69
- // the computed hash first, before doing full test?
70
77
bool operator == (const Vectorized<V>& rhs) const
71
78
{
72
79
// Abort early if sizes do not match
73
80
if (size () != rhs.size ()) return false ;
81
+ // Abort early if hashes exist and don't match
82
+ if (hash_ && rhs.hash_ && hash_ != rhs.hash_ ) return false ;
74
83
// Otherwise test each node for object equality in order
75
84
return std::equal (begin (), end (), rhs.begin (), ObjEqualityFn<T>);
76
85
}
@@ -81,15 +90,6 @@ namespace Sass {
81
90
return !(*this == rhs);
82
91
}
83
92
84
- T& at (size_t i) { return elements_.at (i); }
85
- T& get (size_t i) { return elements_[i]; }
86
- T& operator [](size_t i) { return elements_[i]; }
87
-
88
- const T& at (size_t i) const { return elements_.at (i); }
89
- const T& get (size_t i) const { return elements_[i]; }
90
- // ToDo: might insert am item? (update ordered list)
91
- const T& operator [](size_t i) const { return elements_[i]; }
92
-
93
93
// Implicitly get the sass::vector from our object
94
94
// Makes the Vector directly assignable to sass::vector
95
95
// You are responsible to make a copy if needed
@@ -102,13 +102,14 @@ namespace Sass {
102
102
// You are responsible to make a copy if needed
103
103
// Note: since this returns the real object, we can't
104
104
// Note: guarantee that the hash will not get out of sync
105
- sass::vector<T>& elements () { return elements_; }
105
+ sass::vector<T>& elements43 () { return elements_; }
106
106
const sass::vector<T>& elements () const { return elements_; }
107
107
108
108
// Insert all items from compatible vector
109
109
void concat (const sass::vector<T>& v)
110
110
{
111
111
if (v.empty ()) return ;
112
+ hash_ = 0 ; // reset hash
112
113
elements_.insert (end (),
113
114
v.begin (), v.end ());
114
115
}
@@ -117,6 +118,7 @@ namespace Sass {
117
118
void concat (sass::vector<T>&& v)
118
119
{
119
120
if (v.empty ()) return ;
121
+ hash_ = 0 ; // reset hash
120
122
elements_.insert (elements_.end (),
121
123
std::make_move_iterator (v.begin ()),
122
124
std::make_move_iterator (v.end ()));
@@ -133,27 +135,31 @@ namespace Sass {
133
135
// Insert one item on the front
134
136
void unshift (const T& element)
135
137
{
138
+ hash_ = 0 ; // reset hash
136
139
elements_.insert (begin (),
137
140
std::copy (element));
138
141
}
139
142
140
143
// Insert one item on the front
141
144
void unshift (T&& element)
142
145
{
146
+ hash_ = 0 ; // reset hash
143
147
elements_.insert (begin (),
144
148
std::move (element));
145
149
}
146
150
147
151
// Remove and return item on the front
148
152
T shift () {
149
153
T head = first ();
154
+ hash_ = 0 ; // reset hash
150
155
elements_.erase (begin ());
151
156
return head;
152
157
}
153
158
154
159
// Remove and return item on the back
155
160
T pop () {
156
161
T tail = last ();
162
+ hash_ = 0 ; // reset hash
157
163
elements_.pop_back ();
158
164
return tail;
159
165
}
@@ -162,13 +168,15 @@ namespace Sass {
162
168
// ToDo: rename this to push?
163
169
void append (const T& element)
164
170
{
171
+ hash_ = 0 ; // reset hash
165
172
elements_.emplace_back (element);
166
173
}
167
174
168
175
// Insert one item on the back
169
176
// ToDo: rename this to push?
170
177
void append (T&& element)
171
178
{
179
+ hash_ = 0 ; // reset hash
172
180
elements_.emplace_back (std::move (element));
173
181
}
174
182
@@ -202,18 +210,6 @@ namespace Sass {
202
210
return false ;
203
211
}
204
212
205
- // This might be better implemented as `operator=`?
206
- void elementsM (const sass::vector<T>& e)
207
- {
208
- elements_ = e;
209
- }
210
-
211
- // This might be better implemented as `operator=`?
212
- void elementsM (sass::vector<T>&& e)
213
- {
214
- elements_ = std::move (e);
215
- }
216
-
217
213
template <typename P>
218
214
typename sass::vector<T>::iterator insert (P position, const T& val) {
219
215
return elements_.insert (position, val);
@@ -374,14 +370,14 @@ namespace Sass {
374
370
return elements_;
375
371
}
376
372
377
- const sass::vector<K> keys () const {
373
+ sass::vector<K> keys () const {
378
374
sass::vector<T> list;
379
375
for (auto kv : elements_) {
380
376
list.emplace_back (kv.first );
381
377
}
382
378
return list;
383
379
}
384
- const sass::vector<T> values () const {
380
+ sass::vector<T> values () const {
385
381
sass::vector<T> list;
386
382
for (auto kv : elements_) {
387
383
list.emplace_back (kv.second );
0 commit comments