Adding grpc::string_ref class.

- Strict subset of
  http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
- Useful to avoid unnecessary string copies.
pull/3053/head
Julien Boeuf 9 years ago
parent 6de6cbf599
commit 8fd915ab8d
  1. 4
      BUILD
  2. 49
      Makefile
  3. 13
      build.json
  4. 119
      include/grpc++/string_ref.h
  5. 111
      src/cpp/util/string_ref.cc
  6. 215
      test/cpp/util/string_ref_test.cc
  7. 1
      tools/doxygen/Doxyfile.c++
  8. 2
      tools/doxygen/Doxyfile.c++.internal
  9. 21
      tools/run_tests/sources_and_headers.json
  10. 17
      tools/run_tests/tests.json
  11. 10
      vsprojects/Grpc.mak
  12. 3
      vsprojects/grpc++/grpc++.vcxproj
  13. 6
      vsprojects/grpc++/grpc++.vcxproj.filters
  14. 3
      vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj
  15. 6
      vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters

@ -707,6 +707,7 @@ cc_library(
"src/cpp/util/byte_buffer.cc",
"src/cpp/util/slice.cc",
"src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc",
],
hdrs = [
@ -748,6 +749,7 @@ cc_library(
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h",
@ -794,6 +796,7 @@ cc_library(
"src/cpp/util/byte_buffer.cc",
"src/cpp/util/slice.cc",
"src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc",
],
hdrs = [
@ -835,6 +838,7 @@ cc_library(
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h",

File diff suppressed because one or more lines are too long

@ -68,6 +68,7 @@
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h"
@ -101,6 +102,7 @@
"src/cpp/util/byte_buffer.cc",
"src/cpp/util/slice.cc",
"src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc"
]
},
@ -2100,6 +2102,17 @@
"gpr"
]
},
{
"name": "cxx_string_ref_test",
"build": "test",
"language": "c++",
"src": [
"test/cpp/util/string_ref_test.cc"
],
"deps": [
"grpc++"
]
},
{
"name": "cxx_time_test",
"build": "test",

@ -0,0 +1,119 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef GRPCXX_STRING_REF_H
#define GRPCXX_STRING_REF_H
#include <iterator>
#include <grpc++/config.h>
namespace grpc {
// This class is a non owning reference to a string.
// It should be a strict subset of the upcoming std::string_ref. See:
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
class string_ref {
public:
// types
typedef const char* const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
// constants
static constexpr size_t npos = size_t(-1);
// construct/copy.
constexpr string_ref() : data_(nullptr), length_(0) {}
constexpr string_ref(const string_ref& other)
: data_(other.data_), length_(other.length_) {}
string_ref& operator=(const string_ref& rhs);
string_ref(const char* s);
constexpr string_ref(const char* s, size_t l) : data_(s), length_(l) {}
string_ref(const grpc::string& s) : data_(s.data()), length_(s.length()) {}
// iterators
constexpr const_iterator begin() const { return data_; }
constexpr const_iterator end() const { return data_ + length_; }
constexpr const_iterator cbegin() const { return data_; }
constexpr const_iterator cend() const { return data_ + length_; }
const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}
const_reverse_iterator rend() const {
return const_reverse_iterator(begin());
}
const_reverse_iterator crbegin() const {
return const_reverse_iterator(end());
}
const_reverse_iterator crend() const {
return const_reverse_iterator(begin());
}
// capacity
constexpr size_t size() const { return length_; }
constexpr size_t length() const { return length_; }
constexpr size_t max_size() const { return length_; }
constexpr bool empty() const { return length_ == 0; }
// element access
const char* data() const { return data_; }
// string operations
int compare(string_ref x) const;
bool starts_with(string_ref x) const;
bool ends_with(string_ref x) const;
size_t find(string_ref s) const;
size_t find(char c) const;
// Defined as constexpr in n3442 but C++11 constexpr semantics do not allow
// the implementation of this function to comply.
/* constrexpr */ string_ref substr(size_t pos, size_t n = npos) const;
private:
const char* data_;
size_t length_;
};
// Comparison operators
bool operator==(string_ref x, string_ref y);
bool operator!=(string_ref x, string_ref y);
bool operator<(string_ref x, string_ref y);
bool operator>(string_ref x, string_ref y);
bool operator<=(string_ref x, string_ref y);
bool operator>=(string_ref x, string_ref y);
} // namespace grpc
#endif // GRPCXX_STRING_REF_H

@ -0,0 +1,111 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <grpc++/string_ref.h>
#include <string.h>
#include <algorithm>
namespace grpc {
constexpr size_t string_ref::npos;
string_ref& string_ref::operator=(const string_ref& rhs) {
data_ = rhs.data_;
length_ = rhs.length_;
return *this;
}
string_ref::string_ref(const char* s) : data_(s), length_(strlen(s)) {}
string_ref string_ref::substr(size_t pos, size_t n) const {
if (pos > length_) pos = length_;
if (n > (length_ - pos)) n = length_ - pos;
return string_ref(data_ + pos, n);
}
int string_ref::compare(string_ref x) const {
size_t min_size = length_ < x.length_ ? length_ : x.length_;
int r = memcmp(data_, x.data_, min_size);
if (r < 0) return -1;
if (r > 0) return 1;
if (length_ < x.length_) return -1;
if (length_ > x.length_) return 1;
return 0;
}
bool string_ref::starts_with(string_ref x) const {
return length_ >= x.length_ && (memcmp(data_, x.data_, x.length_) == 0);
}
bool string_ref::ends_with(string_ref x) const {
return length_ >= x.length_ &&
(memcmp(data_ + (length_ - x.length_), x.data_, x.length_) == 0);
}
size_t string_ref::find(string_ref s) const {
auto it = std::search(cbegin(), cend(), s.cbegin(), s.cend());
return it == cend() ? npos : std::distance(cbegin(), it);
}
size_t string_ref::find(char c) const {
auto it = std::find_if(cbegin(), cend(), [c](char cc) { return cc == c; });
return it == cend() ? npos : std::distance(cbegin(), it);
}
bool operator==(string_ref x, string_ref y) {
return x.compare(y) == 0;
}
bool operator!=(string_ref x, string_ref y) {
return x.compare(y) != 0;
}
bool operator<(string_ref x, string_ref y) {
return x.compare(y) < 0;
}
bool operator<=(string_ref x, string_ref y) {
return x.compare(y) <= 0;
}
bool operator>(string_ref x, string_ref y) {
return x.compare(y) > 0;
}
bool operator>=(string_ref x, string_ref y) {
return x.compare(y) >= 0;
}
} // namespace grpc

@ -0,0 +1,215 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <grpc++/string_ref.h>
#include <string.h>
#include <gtest/gtest.h>
namespace grpc {
namespace {
const char kTestString[] = "blah";
const char kTestStringWithEmbeddedNull[] = "blah\0foo";
const size_t kTestStringWithEmbeddedNullLength = 8;
const char kTestUnrelatedString[] = "foo";
class StringRefTest : public ::testing::Test {
};
TEST_F(StringRefTest, Empty) {
string_ref s;
EXPECT_EQ(0, s.length());
EXPECT_EQ(nullptr, s.data());
}
TEST_F(StringRefTest, FromCString) {
string_ref s(kTestString);
EXPECT_EQ(strlen(kTestString), s.length());
EXPECT_EQ(kTestString, s.data());
}
TEST_F(StringRefTest, FromCStringWithLength) {
string_ref s(kTestString, 2);
EXPECT_EQ(2, s.length());
EXPECT_EQ(kTestString, s.data());
}
TEST_F(StringRefTest, FromString) {
string copy(kTestString);
string_ref s(copy);
EXPECT_EQ(copy.data(), s.data());
EXPECT_EQ(copy.length(), s.length());
}
TEST_F(StringRefTest, CopyConstructor) {
string_ref s1(kTestString);;
string_ref s2(s1);
EXPECT_EQ(s1.length(), s2.length());
EXPECT_EQ(s1.data(), s2.data());
}
TEST_F(StringRefTest, FromStringWithEmbeddedNull) {
string copy(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
string_ref s(copy);
EXPECT_EQ(copy.data(), s.data());
EXPECT_EQ(copy.length(), s.length());
EXPECT_EQ(kTestStringWithEmbeddedNullLength, s.length());
}
TEST_F(StringRefTest, Assignment) {
string_ref s1(kTestString);;
string_ref s2;
EXPECT_EQ(nullptr, s2.data());
s2 = s1;
EXPECT_EQ(s1.length(), s2.length());
EXPECT_EQ(s1.data(), s2.data());
}
TEST_F(StringRefTest, Iterator) {
string_ref s(kTestString);
size_t i = 0;
for (char c : s) {
EXPECT_EQ(kTestString[i++], c);
}
EXPECT_EQ(strlen(kTestString), i);
}
TEST_F(StringRefTest, ReverseIterator) {
string_ref s(kTestString);
size_t i = strlen(kTestString);
for (auto rit = s.crbegin(); rit != s.crend(); ++rit) {
EXPECT_EQ(kTestString[--i], *rit);
}
EXPECT_EQ(0, i);
}
TEST_F(StringRefTest, Capacity) {
string_ref empty;
EXPECT_EQ(0, empty.length());
EXPECT_EQ(0, empty.size());
EXPECT_EQ(0, empty.max_size());
EXPECT_EQ(true, empty.empty());
string_ref s(kTestString);
EXPECT_EQ(strlen(kTestString), s.length());
EXPECT_EQ(s.length(), s.size());
EXPECT_EQ(s.max_size(), s.length());
EXPECT_EQ(false, s.empty());
}
TEST_F(StringRefTest, Compare) {
string_ref s1(kTestString);
string s1_copy(kTestString);
string_ref s2(kTestUnrelatedString);
string_ref s3(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
EXPECT_EQ(0, s1.compare(s1_copy));
EXPECT_NE(0, s1.compare(s2));
EXPECT_NE(0, s1.compare(s3));
}
TEST_F(StringRefTest, StartsWith) {
string_ref s1(kTestString);
string_ref s2(kTestUnrelatedString);
string_ref s3(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
EXPECT_TRUE(s1.starts_with(s1));
EXPECT_FALSE(s1.starts_with(s2));
EXPECT_FALSE(s2.starts_with(s1));
EXPECT_FALSE(s1.starts_with(s3));
EXPECT_TRUE(s3.starts_with(s1));
}
TEST_F(StringRefTest, Endswith) {
string_ref s1(kTestString);
string_ref s2(kTestUnrelatedString);
string_ref s3(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
EXPECT_TRUE(s1.ends_with(s1));
EXPECT_FALSE(s1.ends_with(s2));
EXPECT_FALSE(s2.ends_with(s1));
EXPECT_FALSE(s2.ends_with(s3));
EXPECT_TRUE(s3.ends_with(s2));
}
TEST_F(StringRefTest, Find) {
string_ref s1(kTestString);
string_ref s2(kTestUnrelatedString);
string_ref s3(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
EXPECT_EQ(0, s1.find(s1));
EXPECT_EQ(0, s2.find(s2));
EXPECT_EQ(0, s3.find(s3));
EXPECT_EQ(string_ref::npos,s1.find(s2) );
EXPECT_EQ(string_ref::npos,s2.find(s1));
EXPECT_EQ(string_ref::npos,s1.find(s3));
EXPECT_EQ(0, s3.find(s1));
EXPECT_EQ(5, s3.find(s2));
EXPECT_EQ(string_ref::npos, s1.find('z'));
EXPECT_EQ(1, s2.find('o'));
}
TEST_F(StringRefTest, SubString) {
string_ref s(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
string_ref sub1 = s.substr(0, 4);
EXPECT_EQ(string_ref(kTestString), sub1);
string_ref sub2 = s.substr(5);
EXPECT_EQ(string_ref(kTestUnrelatedString), sub2);
}
TEST_F(StringRefTest, ComparisonOperators) {
string_ref s1(kTestString);
string_ref s2(kTestUnrelatedString);
string_ref s3(kTestStringWithEmbeddedNull, kTestStringWithEmbeddedNullLength);
EXPECT_EQ(s1, s1);
EXPECT_EQ(s2, s2);
EXPECT_EQ(s3, s3);
EXPECT_GE(s1, s1);
EXPECT_GE(s2, s2);
EXPECT_GE(s3, s3);
EXPECT_LE(s1, s1);
EXPECT_LE(s2, s2);
EXPECT_LE(s3, s3);
EXPECT_NE(s1, s2);
EXPECT_NE(s1, s3);
EXPECT_NE(s2, s3);
EXPECT_GT(s3, s1);
EXPECT_LT(s1, s3);
}
} // namespace
} // namespace grpc
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

@ -798,6 +798,7 @@ include/grpc++/slice.h \
include/grpc++/status.h \
include/grpc++/status_code_enum.h \
include/grpc++/stream.h \
include/grpc++/string_ref.h \
include/grpc++/stub_options.h \
include/grpc++/thread_pool_interface.h \
include/grpc++/time.h

@ -798,6 +798,7 @@ include/grpc++/slice.h \
include/grpc++/status.h \
include/grpc++/status_code_enum.h \
include/grpc++/stream.h \
include/grpc++/string_ref.h \
include/grpc++/stub_options.h \
include/grpc++/thread_pool_interface.h \
include/grpc++/time.h \
@ -836,6 +837,7 @@ src/cpp/server/server_credentials.cc \
src/cpp/util/byte_buffer.cc \
src/cpp/util/slice.cc \
src/cpp/util/status.cc \
src/cpp/util/string_ref.cc \
src/cpp/util/time.cc
# This tag can be used to specify the character encoding of the source files

@ -1154,6 +1154,21 @@
"test/cpp/util/slice_test.cc"
]
},
{
"deps": [
"gpr",
"gpr_test_util",
"grpc",
"grpc++",
"grpc_test_util"
],
"headers": [],
"language": "c++",
"name": "cxx_string_ref_test",
"src": [
"test/cpp/util/string_ref_test.cc"
]
},
{
"deps": [
"gpr",
@ -13125,6 +13140,7 @@
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h",
@ -13175,6 +13191,7 @@
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h",
@ -13213,6 +13230,7 @@
"src/cpp/util/byte_buffer.cc",
"src/cpp/util/slice.cc",
"src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc"
]
},
@ -13299,6 +13317,7 @@
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h",
@ -13346,6 +13365,7 @@
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
"include/grpc++/string_ref.h",
"include/grpc++/stub_options.h",
"include/grpc++/thread_pool_interface.h",
"include/grpc++/time.h",
@ -13376,6 +13396,7 @@
"src/cpp/util/byte_buffer.cc",
"src/cpp/util/slice.cc",
"src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc"
]
},

@ -1229,6 +1229,23 @@
"windows"
]
},
{
"ci_platforms": [
"linux",
"mac",
"posix",
"windows"
],
"flaky": false,
"language": "c++",
"name": "cxx_string_ref_test",
"platforms": [
"linux",
"mac",
"posix",
"windows"
]
},
{
"ci_platforms": [
"linux",

File diff suppressed because one or more lines are too long

@ -251,6 +251,7 @@
<ClInclude Include="..\..\include\grpc++\status.h" />
<ClInclude Include="..\..\include\grpc++\status_code_enum.h" />
<ClInclude Include="..\..\include\grpc++\stream.h" />
<ClInclude Include="..\..\include\grpc++\string_ref.h" />
<ClInclude Include="..\..\include\grpc++\stub_options.h" />
<ClInclude Include="..\..\include\grpc++\thread_pool_interface.h" />
<ClInclude Include="..\..\include\grpc++\time.h" />
@ -323,6 +324,8 @@
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\status.cc">
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\string_ref.cc">
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\time.cc">
</ClCompile>
</ItemGroup>

@ -91,6 +91,9 @@
<ClCompile Include="..\..\src\cpp\util\status.cc">
<Filter>src\cpp\util</Filter>
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\string_ref.cc">
<Filter>src\cpp\util</Filter>
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\time.cc">
<Filter>src\cpp\util</Filter>
</ClCompile>
@ -210,6 +213,9 @@
<ClInclude Include="..\..\include\grpc++\stream.h">
<Filter>include\grpc++</Filter>
</ClInclude>
<ClInclude Include="..\..\include\grpc++\string_ref.h">
<Filter>include\grpc++</Filter>
</ClInclude>
<ClInclude Include="..\..\include\grpc++\stub_options.h">
<Filter>include\grpc++</Filter>
</ClInclude>

@ -251,6 +251,7 @@
<ClInclude Include="..\..\include\grpc++\status.h" />
<ClInclude Include="..\..\include\grpc++\status_code_enum.h" />
<ClInclude Include="..\..\include\grpc++\stream.h" />
<ClInclude Include="..\..\include\grpc++\string_ref.h" />
<ClInclude Include="..\..\include\grpc++\stub_options.h" />
<ClInclude Include="..\..\include\grpc++\thread_pool_interface.h" />
<ClInclude Include="..\..\include\grpc++\time.h" />
@ -310,6 +311,8 @@
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\status.cc">
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\string_ref.cc">
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\time.cc">
</ClCompile>
</ItemGroup>

@ -76,6 +76,9 @@
<ClCompile Include="..\..\src\cpp\util\status.cc">
<Filter>src\cpp\util</Filter>
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\string_ref.cc">
<Filter>src\cpp\util</Filter>
</ClCompile>
<ClCompile Include="..\..\src\cpp\util\time.cc">
<Filter>src\cpp\util</Filter>
</ClCompile>
@ -195,6 +198,9 @@
<ClInclude Include="..\..\include\grpc++\stream.h">
<Filter>include\grpc++</Filter>
</ClInclude>
<ClInclude Include="..\..\include\grpc++\string_ref.h">
<Filter>include\grpc++</Filter>
</ClInclude>
<ClInclude Include="..\..\include\grpc++\stub_options.h">
<Filter>include\grpc++</Filter>
</ClInclude>

Loading…
Cancel
Save