Boost logo

Boost :

Subject: Re: [boost] [Boost-interest] C++ library for runtime-concepts (type-erasure)
From: Germán Diago (germandiago_at_[hidden])
Date: 2011-02-14 05:14:31


2011/2/14 Daniel Larimer <dlarimer_at_[hidden]>:
> I have posted Boost.IDL to github complete with documentation here:  http://bytemaster.github.com/boost_idl/index.html
>
> https://github.com/bytemaster/boost_idl
>
> The library is header only.  It is included as part of the Boost.Defrag "incubating" projects.
>
> The documentation includes several examples of how it is used to provide a simple 'command line interface' to a struct as well as a fully 'generic' RPC example that will expose any interface over the network using Boost.Serialization.  Full RPC implementation 245 SLOC.  The RPC example is very 'bare bones' because I think that a Boost.RPC library should be a separate project.
>
> I welcome any feedback.
>
> The code is still very 'new' and has not been tested on any platforms other than OS X, but it should all be very portable as I write Mac/Linux/Windows portable software every day.
> Server:
>
>    struct Echo
>    {
>        std::string echo(const std::string &s) { return s; }
>    };
>    BOOST_IDL_INTERFACE( Echo, BOOST_IDL_BASE, (echo) )
>
>    int main()
>    {
>        boost::idl::rpc_server<Echo> server( Echo() );
>        server.listen( 50001 );
>        return 0;
>    }
> Client:
>
>    struct Echo
>    {
>        std::string echo(const std::string &s); // implementation not needed
>    };
>    BOOST_IDL_INTERFACE( Echo, BOOST_IDL_BASE, (echo) )
>
>    int main()
>    {
>        boost::idl::rpc_client<Echo> client;
>        client.connect_to( "localhost", 50001 );
>        std::string s = client.echo( "what's up" );
>        return 0;
>    }
>
> Type Erasure Applied to rpc_client:
>    // erase the details of the rpc_client, by storing
>    // it in a generic Echo interface.
>    boost::idl::any<Echo> any_echo = client;
>
>
> Command Line Interface:
>    template<typename InterfaceType,typename InterfaceDelegate>
>    void start_cli( boost::idl::any<InterfaceType,InterfaceDelegate>& a )
>    {
>        cli  m_cli;
>        m_cli.start_visit(a);
>
>        std::string line;
>        std::string cmd;
>        std::string args;
>
>        while( true )
>        {
>            std::cerr << "Enter Method: ";
>            std::getline( std::cin, line );
>            cmd = line.substr( 0, line.find('(') );
>            args = line.substr( cmd.size(), line.size() );
>            std::cerr << m_cli[cmd](args) << std::endl;
>        }
>    }
>

I haven't carefully read the documentation (sorry, have no time now),
but I thought a lot about a new serialization library. My opinion
is that this library couples two things together: interfaces and reflection.

I think that the correct approach to this is:

1.- Build a general runtime concepts library (without reflection)
2.- Build a reflection mechanism that would be possible for every c++
type to use (non-intrusive).
3.- Build serialization and other reflection mechanisms in top of
these two different libraries.

I tried (but it's incomplete) a new reflection approach, and I think
that with c++0x will be possible. The goal for this reflection library
was
serialization, so it wasn't a general reflection framework, but it was
good enough to serialize objects.

My approach was to use a tuple that described every c++ member that a
class had. It looked something like this:

class MyClass {
        typedef MyClass this_class;

        std::string val_;
        float f_;
public:
        typedef std::tuple<MEM_VARS2(val_, f_)> serializable_members_t;
};

And the rest was done by a general serialize member function (actually
a family with boost::enable_if).
With c++0x I could pass the variable names in tuples if we had
user-defined literals and constexpr (at least, I think so). With this
info, it's very easy to serialize objects in c++ (although I didn't
study every single problem like inheritance and so on).

template <class T>
std::string serialize(const T & t);

With reflection for members and runtime concepts, a framework for RPC
can be built on top of those general and
useful by themselves library.

I hope my opinion helped you.

______________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk