add functions to return string's internal pointers
authorLouis Brandy <ldbrandy@fb.com>
Wed, 11 Sep 2013 16:15:59 +0000 (09:15 -0700)
committerPeter Griess <pgriess@fb.com>
Tue, 15 Oct 2013 01:44:26 +0000 (18:44 -0700)
Summary: See title. This avoids unnecessary copies when needing to access string data directly. These will throw if the dynamic isn't a string.

@override-unit-failures

Test Plan: Unit test.

Reviewed By: delong.j@fb.com

FB internal diff: D986331

folly/dynamic-inl.h
folly/dynamic.h
folly/test/DynamicTest.cpp

index 1893f05142f98511b927907e71c481ef5e62ec83..b9c9136952189a6b0e16eb9ef6a93c60a9230f04 100644 (file)
@@ -374,6 +374,9 @@ inline double   dynamic::asDouble() const { return asImpl<double>(); }
 inline int64_t  dynamic::asInt()    const { return asImpl<int64_t>(); }
 inline bool     dynamic::asBool()   const { return asImpl<bool>(); }
 
+inline const char* dynamic::data()  const { return get<fbstring>().data();  }
+inline const char* dynamic::c_str() const { return get<fbstring>().c_str(); }
+
 template<class T>
 struct dynamic::CompareOp {
   static bool comp(T const& a, T const& b) { return a < b; }
index 41680543c045c9705e70907365aef28db1a230fd..882cd6b534af1465fe1e47756ff6f6771975e6e3 100644 (file)
@@ -272,6 +272,15 @@ public:
   int64_t  asInt() const;
   bool     asBool() const;
 
+  /*
+   * It is occasionally useful to access a string's internal pointer
+   * directly, without the type conversion of `asString()`.
+   *
+   * These will throw a TypeError if the dynamic is not a string.
+   */
+  const char* data()  const;
+  const char* c_str() const;
+
   /*
    * Returns: true if this dynamic is null, an empty array, an empty
    * object, or an empty string.
index 8cfe0b551fd9bf12c6059c9f16efd83cd783fe4e..faf04bf9e13b0fd1e0bd9c8b6f78aa755347d318 100644 (file)
@@ -222,6 +222,17 @@ TEST(Dynamic, Conversions) {
   EXPECT_EQ(12.0, num.asDouble());
 }
 
+TEST(Dynamic, StringPtrs) {
+  dynamic str = "12.0";
+  dynamic num = 12.0;
+
+  EXPECT_EQ(0, strcmp(str.c_str(), "12.0"));
+  EXPECT_EQ(0, strncmp(str.data(), "12.0", str.asString().length()));
+
+  EXPECT_ANY_THROW(num.c_str());
+  EXPECT_ANY_THROW(num.data());
+}
+
 TEST(Dynamic, FormattedIO) {
   std::ostringstream out;
   dynamic doubl = 123.33;