Skip to content

Commit 11b801f

Browse files
committed
Fix C++14 absl::monostate support.
1 parent 88de0ad commit 11b801f

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

pybind11_abseil/absl_casters.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,9 @@ template <typename... Ts>
667667
struct type_caster<absl::variant<Ts...>>
668668
: variant_caster<absl::variant<Ts...>> {};
669669

670+
template <>
671+
struct type_caster<absl::monostate>
672+
: void_caster<absl::monostate> {};
670673
#endif
671674

672675
} // namespace detail

pybind11_abseil/tests/absl_example.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,15 @@ std::vector<absl::variant<A*, B*>> Identity(
344344
return value;
345345
}
346346

347+
bool CheckVariant(const absl::variant<absl::monostate, int> optional, bool given, int value) {
348+
if (!given && !absl::holds_alternative<int>(optional)) return true;
349+
if (given && absl::holds_alternative<int>(optional) && absl::get<int>(optional) == value) return true;
350+
return false;
351+
}
352+
353+
absl::variant<absl::monostate, int> MakeVariant() { return {}; }
354+
absl::variant<absl::monostate, int> MakeVariant(int value) { return value; }
355+
347356
} // namespace test
348357
} // namespace pybind11
349358

@@ -487,6 +496,12 @@ PYBIND11_MODULE(absl_example, m) {
487496
m.def("VariantToInt", &VariantToInt);
488497
m.def("Identity", &Identity);
489498
m.def("IdentityWithCopy", &IdentityWithCopy);
499+
500+
m.def("check_variant", &CheckVariant, arg("optional") = absl::variant<absl::monostate, int>{},
501+
arg("given") = false, arg("value") = 0);
502+
m.def("make_variant", (absl::variant<absl::monostate, int>(*)()) & MakeVariant);
503+
m.def("make_variant", (absl::variant<absl::monostate, int>(*)(int)) & MakeVariant,
504+
arg("value"));
490505
}
491506

492507
} // namespace test

pybind11_abseil/tests/absl_test.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,21 @@ def test_variant(self):
612612
else:
613613
self.assertNotEqual(objs, vector)
614614

615+
def test_pass_default_nullopt(self):
616+
self.assertTrue(absl_example.check_variant())
617+
618+
def test_pass_value(self):
619+
self.assertTrue(absl_example.check_variant(5, True, 5))
620+
621+
def test_pass_none(self):
622+
self.assertTrue(absl_example.check_variant(None, False))
623+
624+
def test_return_value(self):
625+
self.assertEqual(absl_example.make_variant(5), 5)
626+
627+
def test_return_none(self):
628+
self.assertIsNone(absl_example.make_variant())
629+
615630

616631
if __name__ == '__main__':
617632
absltest.main()

0 commit comments

Comments
 (0)