From e84097f46b69b50660f96046a7c9eba8b6731264 Mon Sep 17 00:00:00 2001
From: Enric Tejedor Saavedra <enric.tejedor.saavedra@cern.ch>
Date: Thu, 14 Mar 2019 10:29:15 +0100
Subject: [PATCH] [Exp PyROOT] Implement and test converter for TString&

---
 .../pyroot_experimental/PyROOT/test/tstring_converter.py   | 7 +++++++
 .../pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx  | 1 +
 .../cppyy/patches/tstring_converter.patch                  | 5 +++--
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/bindings/pyroot_experimental/PyROOT/test/tstring_converter.py b/bindings/pyroot_experimental/PyROOT/test/tstring_converter.py
index c8d3eb57762..97c9b666a91 100644
--- a/bindings/pyroot_experimental/PyROOT/test/tstring_converter.py
+++ b/bindings/pyroot_experimental/PyROOT/test/tstring_converter.py
@@ -31,6 +31,13 @@ class TStringConverter(unittest.TestCase):
         self.check_type_conversion()
 
     def test_by_reference(self):
+        ROOT.gInterpreter.Declare("""
+        const char* myfun(TString &s) { return s.Data(); }
+        """)
+
+        self.check_type_conversion()
+
+    def test_by_const_reference(self):
         ROOT.gInterpreter.Declare("""
         const char* myfun(const TString &s) { return s.Data(); }
         """)
diff --git a/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx b/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx
index e1b49618a0b..56d486d3654 100644
--- a/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx
+++ b/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx
@@ -2070,6 +2070,7 @@ public:
 
     // factories for special cases
         gf["TString"] =                     (cf_t)+[](long) { return new TStringConverter{}; };
+        gf["TString&"] =                    (cf_t)+[](long) { return new TStringConverter{}; };
         gf["const TString&"] =              (cf_t)+[](long) { return new TStringConverter{}; };
         gf["const char*"] =                 (cf_t)+[](long) { return new CStringConverter{}; };
         gf["const char[]"] =                (cf_t)+[](long) { return new CStringConverter{}; };
diff --git a/bindings/pyroot_experimental/cppyy/patches/tstring_converter.patch b/bindings/pyroot_experimental/cppyy/patches/tstring_converter.patch
index f8e0f93a5b7..7b9ac8435bf 100644
--- a/bindings/pyroot_experimental/cppyy/patches/tstring_converter.patch
+++ b/bindings/pyroot_experimental/cppyy/patches/tstring_converter.patch
@@ -1,5 +1,5 @@
 diff --git a/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx b/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx
-index a470a41..e1b4961 100644
+index a470a41..56d486d 100644
 --- a/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx
 +++ b/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Converters.cxx
 @@ -1026,6 +1026,7 @@ bool CPyCppyy::name##Converter::ToMemory(PyObject* value, void* address)     \
@@ -10,11 +10,12 @@ index a470a41..e1b4961 100644
  CPPYY_IMPL_STRING_AS_PRIMITIVE_CONVERTER(STLString, std::string, c_str, size)
  CPPYY_IMPL_STRING_AS_PRIMITIVE_CONVERTER(STLStringViewBase, std::string_view, data, size)
  bool CPyCppyy::STLStringViewConverter::SetArg(
-@@ -2068,6 +2069,8 @@ public:
+@@ -2068,6 +2069,9 @@ public:
          gf["const ULong64_t&"] =            gf["const unsigned long long&"];
  
      // factories for special cases
 +        gf["TString"] =                     (cf_t)+[](long) { return new TStringConverter{}; };
++        gf["TString&"] =                    (cf_t)+[](long) { return new TStringConverter{}; };
 +        gf["const TString&"] =              (cf_t)+[](long) { return new TStringConverter{}; };
          gf["const char*"] =                 (cf_t)+[](long) { return new CStringConverter{}; };
          gf["const char[]"] =                (cf_t)+[](long) { return new CStringConverter{}; };
-- 
GitLab