NICE-ESG-Libs Digest        Thu, 21 Dec 95       Volume 1 : Issue 323 
Today's Topics:
                 `Sharing' and ARRAY:make_from_array
  NICE Eiffel Standards Group -- Library Committee Mailing List
  To post to list:
     NICE-ESG-Libs@atlanta.twr.com
  To send mail to the Chairman of the committee:
     NICE-ESG-Libs-chair@atlanta.twr.com
  Administrative matters (sign up, unsubscribe, mail problems, etc):
     NICE-ESG-Libs-request@atlanta.twr.com
 
Date: Thu, 21 Dec 95 10:49:41 EST
From: tynor (Steve Tynor)
Subject: `Sharing' and ARRAY:make_from_array
To: nice-esg-libs
Consider the following comment in the proposed RB-2 version of ARRAY: 
|     make_from_array (a: ARRAY [G])
| 		--  Initialize from the values of 'a'.
| 		-- Useful in particular when 'a' is a manifest array.
| 		-- Note: representation may be shared; to avoid sharing,
| 		-- use as "make_from_array(clone( a ))"
|     require
| 	a_not_void: a /= Void
|     ensure
| 	lower_initialized : lower = a.lower
| 	upper_initialized: upper = a.upper
| 	items_initialized: -- for_all i, lower..upper (item(i) = a.item(i))
I don't think it's a good idea to allow sharing of representation for
this standard feature.  Our implementation does not (as I understand
Eiffel/S's does not). By not specifying that, however, users concerned
about portability must do an explicit `clone' just in case an
implementation shares.  (which can be extreemly inefficient for large
arrays since the elements will be copied twice).
More importantly, however, I cannot devise a reasonable implementation
of "shared" arrays that works in the presense of resizing or
reallocation of the representation (the `area'). 
Imagine that I have two arrays; one which was created with the sharable
`make_from_array' with the other as the argument. I then resize one of
them such that the lower bound changes.  What is a reasonable
representation that will cause the other array to know its `area' was
resized, realloated, or elements were shifted (any or all of which may
have been a side effect of changing the lower bound of the other array
handle).
If sharing is to be allowed, we need BIG FLASHING WARNING SIGNS
(preconditions?) saying that once `make_from_array' is called, the
source or result arrays must be never be resized or reallocated (and
there are several features of the class that might directly or
indirectly do that: `size', `accomodate', `remake', `force', etc.).
I raised this issue with Bertrand some time ago, but I have no record of
ever having recieved a reply.
If sharing is necessary to ISE, I propose that the standard contain only
the non-sharing version (I don't care what it is called: if it improves
backwards compatibility for ISE to call the shating version
`make_from_array', then so be it: lets call the standard feature
something else) and that ISE support a sharing version which is
proprietary to its implementation. Leaving the specification for
`make_from_array' open to sharing or non-sharing is of almost no use to
the end-user who cannot know the precise semantics of the feature he is
calling.  If two implementations provide different semantics, they
should be made available under different names.
Steve
			
		 
		
		
|  |