More than one invariant per struct/class

Jonathan M Davis jmdavisProg at gmx.com
Sat Aug 6 13:53:31 PDT 2011


On Saturday 06 August 2011 22:40:15 simendsjo wrote:
> On 04.08.2011 11:32, simendsjo wrote:
> > I would like to use a template mixin to add some fields to a struct, but
> > I'd also like the template to add additional invariant checks without
> > having to remember to add this for all struct/classes that mixes in this
> > code.
> > 
> > class C {
> > int a;
> > }
> > 
> > mixin template EmbedC() {
> > C _c;
> > 
> > // oops.. more than one invariant
> > invariant() {
> > assert(_c);
> > }
> > 
> > void close() {
> > _c = null;
> > }
> > }
> > 
> > struct S {
> > int i = 10;
> > invariant() {
> > assert(i >= 10);
> > }
> > 
> > mixin EmbedC!();
> > }
> > 
> > void main() {
> > S s;
> > s.close();
> > s._c.a = 10; // access violation, but I want assertion from invariant
> > }
> 
> Should I create a feature request to support more than one invariant?
> It's pretty obvious that it works as designed given the nice error
> message though..

Feel free to create a feature request on it. It may even get the language 
changed. However, having more than one invariant complicates things a bit, 
since right now, it's easy for the runtime to just call the one invariant. If 
you had multiple invariants, they would have to be merged somehow by the 
compiler. It's completely doable, but it definitely complicates things, which 
is probably why it doesn't work that way now.

If you wanted to be able to do it now though, I'd suggest that the mixins not 
have invariants but that they have functions which you then have to call in 
the invariant of the type that they're being mixed into. It's more error 
prone, since you could forget to call one of those functions in the invariant, 
but it allows you to have invariants of a sort in the mixed in code and still 
only have one invariant for the type.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list