|
Geometry : |
Subject: [ggl] space partitioning
From: Duzy Chan (duzy)
Date: 2010-09-09 23:06:16
It's undefined:
struct base
{
};
struct derived : base
{
void blah() { /* ... */ }
};
base obj;
void foo()
{
base * o = &obj;
derived * p = (derived*) o;
p->blah(); //<--------------------------- undefined behavior
}
-- Duzy Chan http://duzy.info On Fri, Sep 10, 2010 at 8:06 AM, Simonson, Lucanus J < lucanus.j.simonson_at_[hidden]> wrote: > Adam Wulkiewicz wrote: > > Barend Gehrels wrote: > >> hi Adam, > >> > >>> > >>> > >>> Yes, I'm using the old version, thanks. But I don't know if I'll > >>> make corrections now. It seems that dynamic self balancing spacial > >>> index is desirable. What do you think about it? > >>> > >> > >> I don't know, it (whether or not self balancing) is probably > >> dependent on the situation and should ideally be configurable. > >> > >> It is of course no problem not making the corrections instantly, I > >> however cannot have a thorough look then (this is usually how I do > >> it, walking through). At least the main program should compile, and > >> I can use the old version, the last time it was sent in two mails, > >> can you send one consistent (compiling) set again? > > > > Hi, > > > > Sorry that I haven't written to you sooner. I'd like to show you > > something else instead of kd-tree. > > The community said that spacial index should work like std::set and > > even > > if I feel different the first data structure should be implemented > > this way. The spacial index may be e.g. a dynamic AABBTree. Leaf and > > internal > > nodes should be different classes derived from one Node class and > > created by allocator or possibly two different allocators defined by > > the user. > > > > I've implemented a generic tree which I'd like to use as a base of > > this container. I've taken the idea from "Game programming gems 4" > > but my version is an intrusive container without memory allocation. > > It's not > > the 'final' container it's just an implementation of some needed > > algorithms and iterators. Users could use this generic tree class to > > build their own trees. > > > > I had two designs in mind. First one was the tree which contains > > pointer > > to root. The tree structure would be defined only by nodes. Nodes > > could > > be manipulated only by use of the tree class and an iterator to node: > > > > child_iterator begin_child(Iter nodeit) > > void push_back_child(node *n, Iter nodeit) > > > > tree t; > > node *n = (node*)create_internal_node(); > > t.push_back(n); > > n = (node*)create_leaf_node(); > > t.push_back_child(n, t.root()); > > > > The second one is a tree derived from node, which I've chosen. The > > main drawbacks are that the tree creation isn't intuitive, there is > > more pointers casting and in this case the tree isn't a container > > actually: > > > > node *n = (node*)create_internal_node(); > > tree *t = (tree*)n; > > n = create_leaf_node(); > > t.push_back_child((tree*)n); > > This syntax isn't technially "legal" because the C++ standard says that the > results of casting a pointer of base type to a pointer of derived type if > the object pointed to is of base type is undefined. That means there is no > guarentee that the code will do what you expect even if it compiles. In > reality it does compile and usually does what you expect, but it is against > boost coding standards to do with sort of thing. I'm not sure what type > your create_internal_node() returns, but I assume it is not tree*. I also > don't think the public interface should provide access to internal nodes, > but regardless, the design of the internals cannot rely on undefined > behavior. > > Regards, > Luke_______________________________________________ > ggl mailing list > ggl_at_[hidden] > http://lists.osgeo.org/mailman/listinfo/ggl > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.osgeo.org/pipermail/ggl/attachments/20100910/2172b145/attachment.html
Geometry list run by mateusz at loskot.net