Commit 0807a71b by Xiaofei Wang Committed by Copybara-Service

Internal change

PiperOrigin-RevId: 436599575
parent df7f5cc8
......@@ -43,6 +43,7 @@
#include "absl/container/btree_map.h"
#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
#include "absl/strings/cord.h"
#include "absl/strings/string_view.h"
#include "absl/time/civil_time.h"
#include "absl/time/time.h"
......@@ -385,6 +386,31 @@ struct type_caster<absl::string_view> : string_caster<absl::string_view, true> {
};
#endif
template <>
struct type_caster<absl::Cord> {
public:
using StringViewCaster = make_caster<absl::string_view>;
PYBIND11_TYPE_CASTER(absl::Cord, _<absl::Cord>());
// Conversion part 1 (Python->C++)
bool load(handle src, bool convert) {
auto caster = StringViewCaster();
if (caster.load(src, convert)) {
absl::string_view view = cast_op<absl::string_view>(std::move(caster));
value = view;
return true;
}
return false;
}
// Conversion part 2 (C++ -> Python)
static handle cast(const absl::Cord& src, return_value_policy policy,
handle parent) {
return StringViewCaster::cast(
absl::string_view(std::string(src)), policy, parent);
}
};
// Convert between absl::optional and python.
//
// pybind11 supports std::optional, and absl::optional is meant to be a
......
......@@ -122,6 +122,15 @@ class StringContainer {
std::string values_;
};
bool CheckAbslCord(absl::Cord cord, const std::string& values) {
return cord == values;
}
absl::Cord ReturnAbslCord(const std::string& values) {
absl::Cord cord(values);
return cord;
}
bool CheckOptional(const absl::optional<int> optional, bool given, int value) {
if (!given && !optional.has_value()) return true;
if (given && optional.has_value() && optional.value() == value) return true;
......@@ -330,6 +339,10 @@ PYBIND11_MODULE(absl_example, m) {
.def(init())
.def("make_string_view", &StringContainer::MakeStringView, arg("values"));
// absl::Cord bindings.
m.def("check_absl_cord", &CheckAbslCord, arg("view"), arg("values"));
m.def("return_absl_cord", &ReturnAbslCord, arg("values"));
// absl::optional bindings.
m.def("check_optional", &CheckOptional, arg("optional") = absl::nullopt,
arg("given") = false, arg("value") = 0);
......
......@@ -333,6 +333,25 @@ class AbslStringViewTest(absltest.TestCase):
absl_example.check_string_view(self.TEST_STRING, self.TEST_STRING))
class AbslCordTest(absltest.TestCase):
TEST_STRING = 'absl_Cord'
TEST_BYTES = b'absl_Cord'
def test_return_absl_cord(self):
self.assertSequenceEqual(
absl_example.return_absl_cord(self.TEST_STRING), self.TEST_STRING)
self.assertSequenceEqual(
absl_example.return_absl_cord(self.TEST_BYTES), self.TEST_STRING)
def test_pass_absl_cord(self):
self.assertTrue(
absl_example.check_absl_cord(self.TEST_STRING, self.TEST_STRING))
self.assertFalse(
absl_example.check_absl_cord(self.TEST_STRING, '12345'))
self.assertTrue(
absl_example.check_absl_cord(self.TEST_BYTES, self.TEST_STRING))
class AbslFlatHashMapTest(absltest.TestCase):
def test_return_map(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment