Hamish Mackenzie wrote:
>
> 3) Why dom::basic_document::clone?  Why not have the copy constructor
> and assignment operator should do a deep copy of the document?  This
> is consistent with other containers. If you want to stick with clone
> return
> an auto_ptr and and derive basic_document from boost::noncopyable.

Whether clone is appropriate depends on the object model that we choose for
Document and Node. One option is the Java-ish

Document d = parse_file("test.xml");
Node n = d.root();

with Document and Node having reference semantics. Internally Document could
be

struct Document
{
    shared_ptr<document_impl> pi_;
};

and Node could be

struct Node
{
    xmlNodePtr impl_; // or however it's spelled
};

A safer Node alternative is

struct Node
{
    xmlNodePtr impl_; // or however it's spelled

    shared_ptr<document_impl> pi_; // keep Document alive
};

Reference semantics are convenient when passing and returning Documents
to/from functions. Documents can be deep copied with clone().

Another option is to drop the reference semantics. A Document can be
noncopyable with clone(), mandating the use of auto_ptr, or it can have deep
copy semantics.

All of these solutions have their pros and cons, but other things being
equal I tend towards the Java model. Deep copy seems inappropriate for a
Document since it is a very expensive operation that's better given an
explicit name. (I just found a bug in my code where I accidentally passed an
expensive data structure by value; performance went downhill, I was
stumped.)

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

Reply via email to