On Thu, 5 Sep 2013, Richard Sandiford wrote:

> Kenneth Zadeck <zad...@naturalbridge.com> writes:
> > It is possible restore the privacy of the original patches but this 
> > seems to involve using a private class inside the namespace and using 
> > C++ friends.
> >
> > Adding visibility adds extra code
> >
> > namespace wi {
> >     class impl {
> >             private:
> >                     add_large() { }
> >     }
> >     friend add(?);
> > };
> >
> > that is roughly 1 line per client that uses an internal routine for the 
> > friend declaration and 5 extra lines for the other stuff.
> >
> > Richard worries that using friends is not within the scope acceptable 
> > C++ mechanisms to use within the gcc community. We are, of course, open 
> > to other suggestions.
> 
> Well, I was more worried that lots of friend clauses were often seen as
> bad design.  It wasn't really an "is this feature OK in gcc" question.
> 
> > My personal view is that privacy is important and I do not want to let 
> > that go. In past comments, Richi, asked that we remove all of the public 
> > method calls that modified the internals of a wide-int. We did this and 
> > we generally are happy that we did this. So there is the question is the 
> > privacy important and if it is what is the proper mechanism to implement it.
> 
> There are two sub-issues here really:
> 
> (1) whether it's OK for wide_ints to be writable.
> 
>     The interface already exposed the idea of an array of blocks,
>     via get_val() and get_len().  The question here is whether it is OK
>     to also have the corresponding write functions write_val() and set_len().
> 
>     IMO if you're exposing the array publicly, there's nothing wrong
>     with having it be a read/write interface rather than a read-only
>     interface.  My analogy on IRC was std::string.  std::string exposes
>     the array of characters, and allows those characters to be both read
>     or written.  The alternative being suggested is the equivalent of
>     saying that anything that wants to directly or indirectly modify
>     individual characters of a std::string must be either a member of
>     std::string or a friend (but reading individual characters is fine).
> 
>     I suppose the alternative is closer to the Java idea of immutable
>     strings.  I don't really see the need for that in C++ though.
>     If you want an object to stay constant after construction,
>     just declare it "const".

If all wide_int ops are non-mutating (which as wide-ints can be
large may be a bad idea, even if it's "clean") then the members
should be not writable apart from at construction time.  Well,
ideally at least - implementation-wise that may not be very easy,
but at least the setters could be private.

> (2) We have some functions that are purely there to handle out-of-line
>     cases for inline functions, like add_large handling the large add
>     cases.  Is it OK for these out-of-line functions to be publicly callable?
> 
>     I think this really is one where we have to trust ourselves not
>     to do something silly.  E.g. the rtl-checking functions use things
>     like rtl_check_failed_type1 to handle the out-of-line case of a
>     checking failure.  That has always been directly callable,
>     but I don't ever remember anyone trying to use it directly.
>     Using things like add_large "accidentally" seems just as unlikely,
>     especially given its array-based interface.
> 
>     If we want a bit of extra dressing to emphasise that these functions
>     are private, we could have something like a wi::priv namespace.

The functions could also be private static member functions of wide_int, 
no?

Richard.

Reply via email to