SegmentString CHANGES (was: [geos-devel] SegmentString modeling)
strk at refractions.net
strk at refractions.net
Mon Feb 20 04:42:39 EST 2006
Just to have this in archive, the SegmentString class changed
it's semantic by *not* promising constness of the CoordinateSequence
passed at construction time.
Also, the getCoordinatesRO() method has been dropped and the
getCoordinates() has been changed to NOT return a clone, but
the CoordinateSequence passed at construction time.
--strk;
On Sat, Feb 18, 2006 at 04:32:06PM +0100, Mateusz Å?oskot wrote:
> strk at refractions.net wrote:
> >On Fri, Feb 17, 2006 at 06:55:02PM +0100, Mateusz Ã
?oskot wrote:
> >>strk at refractions.net wrote:
> >>
> >>>Need some help from C++ gurus. One of the new JTS classes expects to
> >>>modify the Coordinates associated with a SegmentString.
> >>
> >>I wonder why SegmentString::pts is declared as
> >>const CoordinateSequence* pts;
> >>
> >>As I see, in JTS sources SegmentString::pts is not declared as const.
> >>I'm not a Java guru but IMHO const in Java has similar meaning
> >>as in C++.
> >
> >
> >I've been the 'const' pusher in GEOS. I tried adding
> >const-correctness here and there to help maintainance
> >and reduce unneeded copies.
>
> I mostly agree but in this case const does not make better
> const-correctness. Second, it causes problems as now while porting new
> class which requires mutable access to SegmentString::pts which is
> defined as const.
>
> OK, I see one case when current solution makes const-correctness required:
>
> void foo(const CoordinateSequence &a)
> {
> // foo promises to not to modify 'a' object so
> // it requires SegmentString to hold 'a' as const pointer - as
> // it currently is defined
>
> // IMPORTANT!
> // if SegmentString holds 'a' by non-const pointer then foo
> // will fail because it cannot cast from const to non-const
>
> SegmentString b(&a);
> }
>
> This sentence market as IMPORTANT! is very important :-) in case you
> decide to move SegmentString::pts from const to non-const declaration -
> what I also suggested in my previous replies.
> So, if there is some similar function defined as foo above then problems
> may occur.
> I hope my explanation is clear. If my english it very poor then please
> let me know I'll try to make it clearer ;-)
>
> Yesterday, I consulted the problem with my friend and he suggested to
> move this case to more "modern C++" design solution based on policies.
> Policy-based design of classes was introduced by Andrei Alexandrescu
>
> http://en.wikipedia.org/wiki/Policy-based_design
>
> and comes extremely handy in such cases, especially when you may expect
> some design changes (just as this one about moving from const ->
> non-const problem) in future.
>
> Here is simple example how to handle const and non-const versions of the
> same type using policies:
>
> struct use_const
> {
> typedef const A * pointer_type;
> };
>
> struct dont_use_const
> {
> typedef A * pointer_type;
> };
>
> template <class ConstCorrectness>
> class B
> {
> typedef typename ConstCorrectness::pointer_type pointer_type;
> pointer_type a;
> public:
> B(pointer_type p) : a(p) {}
> pointer_type get() { return a; }
> };
>
>
> Now, you can define const version:
>
> B<use_const> b(&a);
>
> and non-const version:
>
> B<dont_use_const> b(&a);
>
> Both versions are interchangable and follows the Liskov Substitution
> Principle:
>
> http://www.objectmentor.com/resources/articles/lsp.pdf
>
>
> >I could take the const out of SegmentString but I guess
> >JTS code itself is not enough to tell what the intended
> >behaviour is.
>
> That's usually the big problem when porting from Java or C# to C++ :-)
>
> Cheers
> --
> Mateusz Åoskot
> http://mateusz.loskot.net
> _______________________________________________
> geos-devel mailing list
> geos-devel at geos.refractions.net
> http://geos.refractions.net/mailman/listinfo/geos-devel
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
State-collected Geographic Data is public property
-*- sign the petition -*-
http://petition.publicgeodata.org
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information about the geos-devel
mailing list