axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kenneth Chiu <ch...@cs.indiana.edu>
Subject Re: writing C++ methods that passes and/or returns arrays
Date Wed, 30 Jul 2003 16:21:14 GMT
By the way, we are working on a C++ reflection API and
library that are interested in contributing, but it may not
fit into the Axis-C++ model.

The basic idea is that metaclasses will be generated from
some source that will describe the class in a
type-independent manner:

    // Get somehow, probably from factory.
    Class c = ...;

    Field f = c.getField("field1");
    f.set(obj, 1);

The user will then register the classes that she wishes to
use for each Schema type.  As the SOAP message comes in, the
main engine will use the class registry to deserialize the
XML in a generic fashion.

For arrays, we are assuming that the user already have their
own array class, so she will need to write adapter classes.
The adapter classes will hopefully usually be very simple,
though.

On Wed, 30 Jul 2003 susantha@opensource.lk wrote:

> On Wed, 30 Jul 2003 00:10:48 -0500 (EST), Kenneth Chiu wrote
> > On Wed, 30 Jul 2003 susantha@opensource.lk wrote:
> > > On Tue, 29 Jul 2003 21:08:35 -0500 (EST), Kenneth Chiu wrote
> > > > On Tue, 29 Jul 2003 susantha@opensource.lk wrote:
> > > >
> > > > > Hi all,
> > > > >
> > > > > Passing arrays as parameters to a method
> > > > > ----------------------------------------
> > > > > Doing this C++ differs from Java. Usually in C++ we pass the size
of
> the
> > > > > array in another parameter so that inside the method it know the
size
> of
> > > the
> > > > > array.
> > > > >
> > > > > In Java this is not a problem because an Array itself is a class
that
> has
> > > the
> > > > > size. So a method in java,
> > > > >           int EchoIntArray(int []) corresponds to int EchoArray(int
> [],
> > > int)
> > > > > in C++.
> > > > >
> > > > > Suppose some one needs to write a web service for this method and
the
> > > method
> > > > > signature that the WSDL describes corresponds to the method signature
> in
> > > Java
> > > > > exactly but not the C++ one.
> > > > >
> > > > > So how should a C++ developer implement his service corresponding
to
> the
> > > > > WSDL ?
> > > > >
> > > > > This way that we (Axis C++) asks the C++ web service developer should
> be
> > > > > decided in order to improve Wrapper Class Generator (WCG) to handle
> > > passing
> > > > > and returning arrays from methods.
> > > > >
> > > > > I find that we can give 2 solutions,
> > > > >
> > > > > 1. Introduce Axis C++ own Array class. So the method signature becomes
> > > > >          int EchoIntArray(AxisArray a)
> > > > >
> > > > > 2. Ask the C++ developer to specify the meaning of other parameters
by
> > > using
> > > > > a predefined Axis C++ macro. Then the method signature becomes,
> > > > >          int EchoIntArray(int [], ARRAYINSIZE int);
> > > > >
> > > > > Which is the best option to choose. IMO I like second.
> > > > >
> > > > > Also if you find any other solution please discuss.
> > > > >
> > > > > Comments on this is very much appreciated.
> > > >
> > >
> > > > I suggest 1, or use std::array, simply because number 2
> > > > seems error-prone.  Also, if you encapsulate the array in an
> > > > object, you can add range checking.  You can
> > > > #ifdef-out the range-checking in the release build.
> > >
> > > I am not aware of an array class in STL. you must be refering to
> std::list.
> >
> > Sorry, I meant std::vector (there is std::valarray, but it's
> > probably not appropriate).
> >
> > > Anyway we hope to allow passing most of STL types as parameters as it is.
> > > When we allow this anyone can pass a std::list or std::map (etc) to a
> method
> > > as parameters. Only thing is we have to improve the Wrapper Class
> Generator
> > > (WCG) to use Axis implimented Serializers and Deserializers for each of
> those
> > > STL types.
> > >
> > > I too like if we can ask C++ web service developers to use std::list
> instead
> > > of an array. If so we (the WCG) can just forget about handling arrays.
> > >
> > > But usually its unlikely that a C++ developer use a std::list when he
> wants
> > > to pass an array of integers (list<int> instead of int[]) but array of
> > > complex types (say list<Address> instead of Address[]) is OK.
> >
> > I think it depends.  If I'm convinced through profiling that
> > performance is an issue, I would just use a very thin wrapper:
> >
> >     template <typename T>
> >     class Array {
> >
> > 	public:
> >
> > 	    explicit Array(int size) : m_data(new T[size]), m_size(size) {}
> >
> > 	    ~Array() {
> > 		delete [] m_data;
> > 	    }
> >
> > 	    T& operator[](size_t i) {
> > 		#ifdef AXIS_DEBUG
> > 		    // Or consider throwing.
> > 		    assert(i < m_size);
> > 		#endif
> > 		return m_data[i];
> > 	    }
> >
> > 	    // Probably want a const version too.
> >
> > 	private:
> >
> > 	    T *m_data;
> > 	    int m_size;
> >     };
> >
> > I try to avoid passing naked, dynamically-sized arrays.
> >
>
> this is very good than using stl::vector
>
> But if some one has already developped a set of methods and wants to expose
> them
> as web services he must be able to do that with least effort.
>
> say, He has a method,
>
> 	int* methodthatreturnsandpassesarrays(int* arr, int insize,
> int*outsize);
>
> If we use Array class he has to write a wrapper method to this
>
> 	Array* methodthatreturnsandpassesarrays(Array* ar)
> 	{
> 	  int retsize;
> 	  int* ret = methodthatreturnsandpassesarrays(ar->GetArray(), ar-
> >GetSize(), &retsize)
> 	  Array* retA = new Array<int>(retsize);
>
> 	  loop to intialize retA from ret or memset ...
> 	  delete [] ret;
> 	  return retA;
> 	}
>
> If we use 2 nd approach, the wrapper is not needed, only thing he has to do
> is to add few macros
> that only WCG recognizes.
>
> 	int* methodthatreturnsandpassesarrays(int* arr, INARRAYSIZE int
> insize, RETARRAYSIZE int*outsize);
>
> In case if the method has many/fewer parameters or different parameter order
> he will have to
> write a wrapper method that will be simple. for example if the above method
> written like,
>
> 	int* methodthatreturnsandpassesarrays(int* arr, char c, int insize,
> int* outsize, Address* ad);
>
> the wrapper method will be,
>
> 	int* methodthatreturnsandpassesarrays(int* arr, INARRAYSIZE int
> insize, char c, Address* ad, RETARRAYSIZE int*outsize )
> 	{
> 		return methodthatreturnsandpassesarrays(arr, c, insize,
> outsize, ad);
> 	}
>
> What do you think ?
>
> thanks,
>
> Susantha.
>
>
>
> > If I'm not concerned about performance, then I just use
> > std::vector.
> >
> > > Also we can use both 1 & 2 methods.
> > > May be 2 for simple types as int char etc and 1 for complex types ????
> > >
> > > Susantha.
> > >
> > > >
> > > > Whether to write your own or use std::array depends on a lot
> > > > of factors.
> > >
> > >
> > > --
> > > Lanka Software Foundation (http://www.opensource.lk)
> > > Promoting Open-Source Development in Sri Lanka
>
>
> --
> Lanka Software Foundation (http://www.opensource.lk)
> Promoting Open-Source Development in Sri Lanka
>

Mime
View raw message