<div>Hi, all...</div><div> </div><div>I just realized, if you write your proxy correctly, your original class Value<T> probably works just fine for more exotic types (when T is your proxy class giving access to the underlying type), without my proposed interface layer.  In fact, for purposes of reference semantics, the original is probably preferred.</div>
<div> </div><div>Perhaps I should have read that doc more than three times...</div><div> </div><div>Regardless, I look forward to your comments and the final product.</div><div> </div><div>D.J.<br><br></div><div class="gmail_quote">
On Fri, Apr 29, 2011 at 11:01 PM, D.J. Caldwell <span dir="ltr"><<a href="mailto:dlcaldwelljr@gmail.com">dlcaldwelljr@gmail.com</a>></span> wrote:<br><blockquote style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;" class="gmail_quote">
<div>Hi Sukender and fellow interested parties,</div><div> </div><div>I've finally had a chance to review your meta-data doc (version 4) to see what you all have been designing, and how we might be able to use it in our project.</div>


<div> </div><div>Overall, I must say the design looks good.  I really appreciate the effort you have put into it.</div><div> </div><div>I do have a few design points you may (not) find interesting, so feel free to accept/modify/comment/ignore as you see fit (as long as you take credit for any mods/comments that you make ;-) ).  If you think I've misunderstood something, feel free to give me pointers where I may have gone off track; I only hope I am not stating the obvious, thereby wasting people's time.</div>


<div> </div><div>1) By deprecating user data and description lists, and integrating them into the proposed meta-data system until those interfaces are removed, you have some major side effects:</div><div>    a) With the current proposal, replacing a meta-data container destroys any legacy user data or descriptions that may already be present.  If this is a desirable side effect, so be it, but users should be explicitly made aware of this side effect.</div>


<div>    b) User data and description lists will not be a viable work around (because they will are deprecated) for users who cannot, or will not, convert to the new meta-data system and also do not wish to replace any existing meta-data on a node.  They will be forced to use some other means (probably external) to store their data.  Again, if this is a desirable side effect, so be it.</div>


<div>    c) For data base accessors, user data and/or description lists may (not) be totally inappropriate when choosing the "proxy container" route; a meta-data value that holds a "proxy container" may be preferred.  I have little to know experience with data bases, so others will have more insight into this sort of thing, but I thought it worth mentioning.</div>


<div> </div><div>2) I think you might be missing an interface layer that is necessary for the type system to work for user defined containers that have "proxy" values, but do not want to pay the default cost of storing a T value:</div>

<div> </div><div>[code]</div><div> </div>
<div>// slight mod from current design<br>class ValueBase : public Referenced<br>{<br>protected:<br>    // do we not need a virtual destructor here, since containers will<br>    // hold ref_ptr to this?<br>    virtual ~ValueBase() {}<br>


};</div><div> </div><div>// type specific interface for getting type specific values into/out of<br>// containers, without revealing how the value itself is stored here<br>template<typename T> ValueT : public ValueBase<br>


{<br>public:<br>    // interface layer needs to able to virtually assign values; copy<br>    // constructors need more detail, so we must go to the most derived<br>    // type for that, and we should be using clone for that anyway<br>


    ValueT& operator=(const ValueT& val)<br>    { xassign(val.value()); return *this; }<br>    ValueT& operator=(const T& val) { xassign(val); return *this; }</div><div>    virtual T & value() = 0;<br>

    virtual const T & value() const = 0;<br>    // const so we can use it anywhere excpet for assignment to this</div><div>    // value<br>
    operator T() const { return value (); }<br>protected:<br>    // derived types tend to need explicitly defined destructors<br>    virtual ~ValueT() {}<br>private:<br>    // yes, this is virtual and private, but client code should not be<br>


    // calling this unless we provided "set" methods other than straight<br>    // assignment; the pattern is unusual, but it works<br>    virtual void xassign(const T& val) = 0;<br>};</div><div> </div><div>


// renamed from "Value<T>" with slight mods</div><div>template<class T> class BasicValue : public ValueT<T><br>{<br>public:<br>    //virtual const char * className() const;<br>    /** Constructor*/<br>


    BasicValue() {}<br>    /** Contructor from T.*/<br>    BasicValue(const T& val) { _value = val; }<br>    /** Copy constructor*/<br>    BasicValue(const BasicValue<T>& val) { _value = val._value; }</div>

<div>
    BasicValue& operator=(const T& val) { _value = val; return *this; }<br>    BasicValue& operator=(const BasicValue& val) { _value = val._value; return *this; }</div><div>    T & value() { return _value; }<br>


    const T & value() const { return _value; }<br>    /* Implicit conversion */</div><div>    // see ValueT, above<br>    //operator T() { return _value; }<br>protected:<br>    /** the stored value*/<br>    T _value;</div>


<div>    // derived types tend to need explicitly defined destructors<br>    virtual ~BasicValue() {}<br>    /** overloaded == operators, we have to be extra careful because T type doesn't necessarily have ==<br>    * overloaded.*/<br>


    friend inline bool operator==(const BasicValue<T>& left,const BasicValue<T>& right){ return left._value==right._value; }<br>    friend inline bool operator==(const T& left,const BasicValue<T>& right){ return left==right._value; }<br>


    friend inline bool operator==(const BasicValue<T>& left,const T& right){ return left._value==right; }</div><div>private:</div><div>    // virtual assignment for use with the interface layer, ValueT<T><br>


    virtual void xassign(const T& val) { _value = T; }</div><div>};</div><div> </div><div>[/code]</div><div> </div><div>By "forcing" users to derive from the interface template, ValueT<T>, you can guarantee a common type safe interface for casting inside your generic meta-data containers, without the expense of storing T objects locally.  Your existing class, Value<T> (I renamed it BasicValue<T>) will still work for initialization with plain old data types and compatible types, but you do not have to pay for the storage of a potentially useless T object for more exotic types (data base accessors, etc).</div>


<div> </div><div>Thanks, again, and I look forward to seeing the final product.</div><div> </div><font color="#888888"><div>D.J.<br><br></div></font><div><div></div><div class="h5"><div class="gmail_quote">On Thu, Apr 28, 2011 at 3:26 AM, Torben Dannhauer <span dir="ltr"><<a href="mailto:torben@dannhauer.info" target="_blank">torben@dannhauer.info</a>></span> wrote:<br>


<blockquote style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;" class="gmail_quote">Hi all,<br>
<br>
this meta system looks very interesting. I started to implement such a system for osgVisual for data management, but it seems that your approach is much more sophisticated and finally allows me to plug in my use cases quite easy.<br>



I'm happy that such a framework is developed for OSG. I have cross-read the V4 document, but unfortunately I'm currently too much occupied by my doctoral thesis to add usefull ideas/components. I'll try to stay up to date and maybe can add some comments.<br>



<br>
Thanks for your effort, it is great work!<br>
<br>
Best regards from Salzburg,<br>
Torben<br>
<br>
------------------<br>
Read this topic online here:<br>
<a href="http://forum.openscenegraph.org/viewtopic.php?p=38841#38841" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=38841#38841</a><br>
<div><div></div><div><br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org" target="_blank">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</div></div></blockquote></div><br>
</div></div></blockquote></div><br>