Browse Source

make butil::ScopedVector<T> support initializer_list

lrita 3 years ago
parent
commit
6d06398a67
2 changed files with 17 additions and 0 deletions
  1. 6 0
      src/butil/memory/scoped_vector.h
  2. 11 0
      test/scoped_vector_unittest.cc

+ 6 - 0
src/butil/memory/scoped_vector.h

@@ -6,6 +6,9 @@
 #define BUTIL_MEMORY_SCOPED_VECTOR_H_
 
 #include <vector>
+#if __cplusplus >= 201103L  // >= C++11
+#include <initializer_list>
+#endif
 
 #include "butil/basictypes.h"
 #include "butil/logging.h"
@@ -38,6 +41,9 @@ class ScopedVector {
   ScopedVector() {}
   ~ScopedVector() { clear(); }
   ScopedVector(RValue other) { swap(*other.object); }
+#if __cplusplus >= 201103L  // < C++11
+  ScopedVector(std::initializer_list<value_type> il) : v_(il) {}
+#endif  // __cplusplus < 201103L
 
   ScopedVector& operator=(RValue rhs) {
     swap(*rhs.object);

+ 11 - 0
test/scoped_vector_unittest.cc

@@ -203,6 +203,17 @@ TEST(ScopedVectorTest, Scope) {
   EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
 }
 
+TEST(ScopedVectorTest, Scope2) {
+  LifeCycleWatcher watcher;
+  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
+  {
+    butil::ScopedVector<LifeCycleObject> scoped_vector{ watcher.NewLifeCycleObject() };
+    EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
+    EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
+  }
+  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
+}
+
 TEST(ScopedVectorTest, MoveConstruct) {
   LifeCycleWatcher watcher;
   EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());