Re: std::string vs other strings

Roman Kubiak <[email protected]> Tue, 13 Nov 2012 18:43:51 +0100
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <CACugK=bH_tBPcRRjXw=SoE+fqU=Vo0O7BjyymU4i97ir7LM=Wg@mail.gmail.com>
I thought that maybe policies are for that. What i mean is to pass a policy
to the console() .def() call and say, don't convert the first parameter for
that function, just pass the reference to it. But i don't know how to do
that.

====================================================================
         _ _                              _           _ _        _
__ _____| | |_ __ _ __ _ ___   __ ___ _ _| |_ _ _ ___| | |___ __| |
\ V / _ \ |  _/ _` / _` / -_) / _/ _ \ ' \  _| '_/ _ \ | / -_) _` |
 \_/\___/_|\__\__,_\__, \___| \__\___/_||_\__|_| \___/_|_\___\__,_|
                   |___/
====================================================================






On Tue, Nov 13, 2012 at 6:27 PM, Roman Kubiak <[email protected]>wrote:

> My converter is pretty simple:
> namespace luabind
> {
> template <> struct default_converter<String> :
> native_converter_base<String>
>  {
> static int compute_score(lua_State* L, int index)
> {
>  _DBG("default_converter<String>::compute_score got userdata");
> return (lua_type(L, index) == LUA_TSTRING) ? 0 : -1;
>  }
>  String from(lua_State* L, int index)
> {
>  _DBG("default_converter<String>::from from");
> return String(lua_tostring(L, index));
>  }
>  void to(lua_State* L, String const &value)
>  {
> _DBG("default_converter<String>::from to");
> lua_pushlstring(L, value.toUTF8(), value.length());
>  }
> };
>
> template <> struct default_converter<String const&> :
> default_converter<String>
>  {
> };
> }
>
> When i do in lua:
> console("helo")
>
> i get this output:
> (25757538) default_converter<String>::compute_score got userdata
> (25757539.7) default_converter<String>::from from
> helo
>
> When i do:
> str = String("helo")
> console(str)
>
> i get this:
> (25807812.1) default_converter<String>::compute_score got userdata
> ERROR: No matching overload found, candidates:
> void console(String const&)
>
>
> ====================================================================
>          _ _                              _           _ _        _
> __ _____| | |_ __ _ __ _ ___   __ ___ _ _| |_ _ _ ___| | |___ __| |
> \ V / _ \ |  _/ _` / _` / -_) / _/ _ \ ' \  _| '_/ _ \ | / -_) _` |
>  \_/\___/_|\__\__,_\__, \___| \__\___/_||_\__|_| \___/_|_\___\__,_|
>                    |___/
> ====================================================================
>
>
>
>
>
>
> On Tue, Nov 13, 2012 at 5:42 AM, Cory Riddell <[email protected]> wrote:
>
>>  I don't have your String class, so I tried the same thing you describing
>> using MFC CStrings.
>>
>> In my C++ code, I defined the following:
>>
>> void console(const CString &textToPrint)
>> {
>>     // write output to a debug window and echo it to a log file
>>     printToOutput(std::string(textToPrint));
>> }
>>
>> CString getName()
>> {
>>     return CString("my name");
>> }
>>
>> I bound them:
>>     luabind::module(myLuaState) [
>>         luabind::def("console", console),
>>         luabind::def("getName", getName)
>>     ];
>>
>> Then called them in a lua script:
>>     console(getName())
>>
>> Everything seemed to work just fine. The string "my name" is written to
>> my debug window and echoed to my log file by my printToOutput function.
>>
>> Maybe post your converter definitions and how you are binding to lua.
>>
>> Cory
>>
>>
>> On 11/12/2012 12:59 PM, Roman Kubiak wrote:
>>
>> I got back to the problem and tried again with the conversion, i noticed
>> that it matters when the converter is defined in the include files, so now
>> i get the converter working, but too much.
>> i have a simple method that prints a string to the console defined as
>> void console (const String &textToPrint);
>> and i have loads of methods/functions that return a String() object for
>> example:
>> String getName() { return (String("my name")); }
>>
>>  now when the converter is registered i can't do
>> console (getName())
>>
>>  this causes an error saying there are no valid candidates for the
>> console call, i noticed that the converter is
>> using the compute_score() to determine if a String() object is a string
>> (lua_type(L, index) == LUA_TSTRING) and i'ts not
>> it's LUA_TUSERDATA, now if i return 1 in compute_score() the function
>> from() will be called but it will have the
>> String() object on the stack, and i can't convert it using
>> luabind::object() since it's object_cast<>() methos will
>> call the converter again, and it will loop forever.
>>
>>  What's the solution to this ?
>>
>> ====================================================================
>>          _ _                              _           _ _        _
>> __ _____| | |_ __ _ __ _ ___   __ ___ _ _| |_ _ _ ___| | |___ __| |
>> \ V / _ \ |  _/ _` / _` / -_) / _/ _ \ ' \  _| '_/ _ \ | / -_) _` |
>>  \_/\___/_|\__\__,_\__, \___| \__\___/_||_\__|_| \___/_|_\___\__,_|
>>                    |___/
>> ====================================================================
>>
>>
>>
>>
>>
>>
>> On Mon, Nov 12, 2012 at 4:47 PM, Cory Riddell <[email protected]> wrote:
>>
>>> Thank you for the pointer. It ended up being incredibly simple. Here's
>>> my code for CString:
>>>
>>> namespace luabind
>>> {
>>>     template <>
>>>     struct default_converter<CString>
>>>       : native_converter_base<CString>
>>>     {
>>>         static int compute_score(lua_State* L, int index)
>>>         {
>>>             return lua_type(L, index) == LUA_TSTRING ? 0 : -1;
>>>         }
>>>
>>>         CString from(lua_State* L, int index)
>>>         {
>>>             return CString(lua_tostring(L, index), lua_rawlen(L, index));
>>>         }
>>>
>>>         void to(lua_State* L, CString const& value)
>>>         {
>>>             lua_pushlstring(L, (LPCTSTR)value, value.GetLength());
>>>         }
>>>     };
>>>
>>>     template <>
>>>     struct default_converter<CString const>
>>>       : default_converter<CString>
>>>     {};
>>>
>>>     template <>
>>>     struct default_converter<CString const&>
>>>       : default_converter<CString>
>>>     {};
>>> }
>>>
>>>
>>> The only possible problem that I can see here is needing to convert from
>>> wchar_t to char (utf-8) when making a unicode build.
>>>
>>> Cory
>>>
>>>
>>>
>>> On 11/9/2012 3:35 PM, Willi Schinmeyer wrote:
>>> > The std::string converter seems to be defined in detail/policy.hpp:756
>>> > as a specialization of default_converter. I'd start my investigation
>>> there.
>>> >
>>> >
>>> ------------------------------------------------------------------------------
>>> > Everyone hates slow websites. So do we.
>>> > Make your web apps faster with AppDynamics
>>> > Download AppDynamics Lite for free today:
>>> > http://p.sf.net/sfu/appdyn_d2d_nov
>>> > _______________________________________________
>>> > luabind-user mailing list
>>> > [email protected]
>>> > https://lists.sourceforge.net/lists/listinfo/luabind-user
>>> >
>>>
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Everyone hates slow websites. So do we.
>>> Make your web apps faster with AppDynamics
>>> Download AppDynamics Lite for free today:
>>> http://p.sf.net/sfu/appdyn_d2d_nov
>>> _______________________________________________
>>> luabind-user mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/luabind-user
>>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Monitor your physical, virtual and cloud infrastructure from a single
>> web console. Get in-depth insight into apps, servers, databases, vmware,
>> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
>> Pricing starts from $795 for 25 servers or applications!http://p.sf.net/sfu/zoho_dev2dev_nov
>>
>>
>>
>> _______________________________________________
>> luabind-user mailing [email protected]://lists.sourceforge.net/lists/listinfo/luabind-user
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Monitor your physical, virtual and cloud infrastructure from a single
>> web console. Get in-depth insight into apps, servers, databases, vmware,
>> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
>> Pricing starts from $795 for 25 servers or applications!
>> http://p.sf.net/sfu/zoho_dev2dev_nov
>> _______________________________________________
>> luabind-user mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/luabind-user
>>
>>
>

------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov

_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user