[Bf-blender-cvs] [23c1b1edc8b] functions: deduplicate string ref code

Jacques Lucke noreply at git.blender.org
Wed May 15 11:43:17 CEST 2019


Commit: 23c1b1edc8bf3c9e55576ee2893d1b6b3cb2e90b
Author: Jacques Lucke
Date:   Wed May 15 11:38:06 2019 +0200
Branches: functions
https://developer.blender.org/rB23c1b1edc8bf3c9e55576ee2893d1b6b3cb2e90b

deduplicate string ref code

===================================================================

M	source/blender/blenlib/BLI_string_ref.hpp
M	tests/gtests/blenlib/BLI_string_ref_test.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_string_ref.hpp b/source/blender/blenlib/BLI_string_ref.hpp
index 17d8577886e..1a214a29544 100644
--- a/source/blender/blenlib/BLI_string_ref.hpp
+++ b/source/blender/blenlib/BLI_string_ref.hpp
@@ -10,29 +10,19 @@
 
 namespace BLI {
 
-class StringRefNull {
+class StringRefBase {
  public:
   using size_type = size_t;
 
- private:
+ protected:
   const char *m_data;
   size_type m_size;
 
- public:
-  StringRefNull() : m_data(""), m_size(0)
-  {
-  }
-
-  StringRefNull(const char *str) : m_data(str), m_size(strlen(str))
-  {
-    BLI_assert(str != NULL);
-    BLI_assert(m_data[m_size] == '\0');
-  }
-
-  StringRefNull(const std::string &str) : StringRefNull(str.data())
+  StringRefBase(const char *data, size_type size) : m_data(data), m_size(size)
   {
   }
 
+ public:
   size_type size() const
   {
     return m_size;
@@ -54,87 +44,76 @@ class StringRefNull {
     return std::string(m_data, m_size);
   }
 
-  friend std::ostream &operator<<(std::ostream &stream, StringRefNull ref)
+  friend std::ostream &operator<<(std::ostream &stream, StringRefBase ref)
   {
     stream << ref.to_std_string();
     return stream;
   }
 
-  friend std::string operator+(const char *a, const StringRefNull b)
+  friend std::string operator+(const StringRefBase a, const StringRefBase b)
+  {
+    return a.to_std_string() + b.data();
+  }
+
+  friend std::string operator+(const char *a, const StringRefBase b)
   {
     return a + b.to_std_string();
   }
 
-  friend std::string operator+(const StringRefNull a, const char *b)
+  friend std::string operator+(const StringRefBase a, const char *b)
   {
     return a.to_std_string() + b;
   }
 
-  friend std::string operator+(const std::string &a, const StringRefNull b)
+  friend std::string operator+(const std::string &a, const StringRefBase b)
   {
     return a + b.data();
   }
 
-  friend std::string operator+(const StringRefNull a, const std::string &b)
+  friend std::string operator+(const StringRefBase a, const std::string &b)
   {
     return a.data() + b;
   }
 };
 
-class StringRef {
- public:
-  using size_type = size_t;
-
- private:
-  const char *m_data;
-  size_type m_size;
+class StringRefNull : public StringRefBase {
 
  public:
-  StringRef() : m_data(nullptr), m_size(0)
-  {
-  }
-
-  StringRef(StringRefNull other) : m_data(other.data()), m_size(other.size())
-  {
-  }
-
-  StringRef(const char *str) : m_data(str), m_size(str ? strlen(str) : 0)
+  StringRefNull() : StringRefBase("", 0)
   {
   }
 
-  StringRef(const char *str, size_type length) : m_data(str), m_size(length)
+  StringRefNull(const char *str) : StringRefBase(str, strlen(str))
   {
+    BLI_assert(str != NULL);
+    BLI_assert(m_data[m_size] == '\0');
   }
 
-  StringRef(const std::string &str) : m_data(str.data()), m_size(str.size())
+  StringRefNull(const std::string &str) : StringRefNull(str.data())
   {
   }
+};
 
-  size_type size() const
+class StringRef : public StringRefBase {
+ public:
+  StringRef() : StringRefBase(nullptr, 0)
   {
-    return m_size;
   }
 
-  const char *data() const
+  StringRef(StringRefNull other) : StringRefBase(other.data(), other.size())
   {
-    return m_data;
   }
 
-  char operator[](size_type index) const
+  StringRef(const char *str) : StringRefBase(str, str ? strlen(str) : 0)
   {
-    BLI_assert(index < m_size);
-    return m_data[index];
   }
 
-  std::string to_std_string() const
+  StringRef(const char *str, size_type length) : StringRefBase(str, length)
   {
-    return std::string(m_data, m_size);
   }
 
-  friend std::ostream &operator<<(std::ostream &stream, StringRef ref)
+  StringRef(const std::string &str) : StringRefBase(str.data(), str.size())
   {
-    stream << ref.to_std_string();
-    return stream;
   }
 };
 
diff --git a/tests/gtests/blenlib/BLI_string_ref_test.cc b/tests/gtests/blenlib/BLI_string_ref_test.cc
index 5cff6adb7a4..fe994553a5c 100644
--- a/tests/gtests/blenlib/BLI_string_ref_test.cc
+++ b/tests/gtests/blenlib/BLI_string_ref_test.cc
@@ -78,3 +78,39 @@ TEST(string_ref, Print)
   EXPECT_EQ(str.size(), 8);
   EXPECT_EQ(str, "testtest");
 }
+
+TEST(string_ref, Add)
+{
+  StringRef a("qwe");
+  StringRef b("asd");
+  std::string result = a + b;
+  EXPECT_EQ(result, "qweasd");
+}
+
+TEST(string_ref, AddCharPtr1)
+{
+  StringRef ref("test");
+  std::string result = ref + "qwe";
+  EXPECT_EQ(result, "testqwe");
+}
+
+TEST(string_ref, AddCharPtr2)
+{
+  StringRef ref("test");
+  std::string result = "qwe" + ref;
+  EXPECT_EQ(result, "qwetest");
+}
+
+TEST(string_ref, AddString1)
+{
+  StringRef ref("test");
+  std::string result = ref + std::string("asd");
+  EXPECT_EQ(result, "testasd");
+}
+
+TEST(string_ref, AddString2)
+{
+  StringRef ref("test");
+  std::string result = std::string("asd") + ref;
+  EXPECT_EQ(result, "asdtest");
+}



More information about the Bf-blender-cvs mailing list