@@ -52,25 +52,34 @@ namespace Sass {
5252 if (!childless) elements_ = std::move (vec);
5353 }
5454
55- // Allow destructor overloading
56- // virtual ~Vectorized() {};
57-
5855 // 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 (); }
6456 void clear () { return elements_.clear (); }
6557 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+ }
6675
6776 // Check underlying containers for equality
68- // Note: maybe we could gain some speed by checking
69- // the computed hash first, before doing full test?
7077 bool operator == (const Vectorized<V>& rhs) const
7178 {
7279 // Abort early if sizes do not match
7380 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 ;
7483 // Otherwise test each node for object equality in order
7584 return std::equal (begin (), end (), rhs.begin (), ObjEqualityFn<T>);
7685 }
@@ -81,15 +90,6 @@ namespace Sass {
8190 return !(*this == rhs);
8291 }
8392
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-
9393 // Implicitly get the sass::vector from our object
9494 // Makes the Vector directly assignable to sass::vector
9595 // You are responsible to make a copy if needed
@@ -102,13 +102,14 @@ namespace Sass {
102102 // You are responsible to make a copy if needed
103103 // Note: since this returns the real object, we can't
104104 // 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_; }
106106 const sass::vector<T>& elements () const { return elements_; }
107107
108108 // Insert all items from compatible vector
109109 void concat (const sass::vector<T>& v)
110110 {
111111 if (v.empty ()) return ;
112+ hash_ = 0 ; // reset hash
112113 elements_.insert (end (),
113114 v.begin (), v.end ());
114115 }
@@ -117,6 +118,7 @@ namespace Sass {
117118 void concat (sass::vector<T>&& v)
118119 {
119120 if (v.empty ()) return ;
121+ hash_ = 0 ; // reset hash
120122 elements_.insert (elements_.end (),
121123 std::make_move_iterator (v.begin ()),
122124 std::make_move_iterator (v.end ()));
@@ -133,27 +135,31 @@ namespace Sass {
133135 // Insert one item on the front
134136 void unshift (const T& element)
135137 {
138+ hash_ = 0 ; // reset hash
136139 elements_.insert (begin (),
137140 std::copy (element));
138141 }
139142
140143 // Insert one item on the front
141144 void unshift (T&& element)
142145 {
146+ hash_ = 0 ; // reset hash
143147 elements_.insert (begin (),
144148 std::move (element));
145149 }
146150
147151 // Remove and return item on the front
148152 T shift () {
149153 T head = first ();
154+ hash_ = 0 ; // reset hash
150155 elements_.erase (begin ());
151156 return head;
152157 }
153158
154159 // Remove and return item on the back
155160 T pop () {
156161 T tail = last ();
162+ hash_ = 0 ; // reset hash
157163 elements_.pop_back ();
158164 return tail;
159165 }
@@ -162,13 +168,15 @@ namespace Sass {
162168 // ToDo: rename this to push?
163169 void append (const T& element)
164170 {
171+ hash_ = 0 ; // reset hash
165172 elements_.emplace_back (element);
166173 }
167174
168175 // Insert one item on the back
169176 // ToDo: rename this to push?
170177 void append (T&& element)
171178 {
179+ hash_ = 0 ; // reset hash
172180 elements_.emplace_back (std::move (element));
173181 }
174182
@@ -202,18 +210,6 @@ namespace Sass {
202210 return false ;
203211 }
204212
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-
217213 template <typename P>
218214 typename sass::vector<T>::iterator insert (P position, const T& val) {
219215 return elements_.insert (position, val);
@@ -374,14 +370,14 @@ namespace Sass {
374370 return elements_;
375371 }
376372
377- const sass::vector<K> keys () const {
373+ sass::vector<K> keys () const {
378374 sass::vector<T> list;
379375 for (auto kv : elements_) {
380376 list.emplace_back (kv.first );
381377 }
382378 return list;
383379 }
384- const sass::vector<T> values () const {
380+ sass::vector<T> values () const {
385381 sass::vector<T> list;
386382 for (auto kv : elements_) {
387383 list.emplace_back (kv.second );
0 commit comments