From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,1f0bebbd5edf4a6f X-Google-Attributes: gid103376,public From: Simon Wright Subject: Re: Please help a newbie with Booch/Ada. Date: 1998/08/27 Message-ID: #1/1 X-Deja-AN: 385187127 X-NNTP-Posting-Host: pogner.demon.co.uk:158.152.70.98 References: <35DCCE3A.9EAE78D8@pacbell.net> X-Complaints-To: abuse@demon.net X-Trace: news.demon.co.uk 904200702 nnrp-05:28321 NO-IDENT pogner.demon.co.uk:158.152.70.98 Organization: At Home Newsgroups: comp.lang.ada Date: 1998-08-27T00:00:00+00:00 List-Id: Stephen Leake writes: > Lengyel Sandor writes: > > > I am fooling around with the Booch components, since I think > > "Collections" are very usefull. > > good idea. > > > PACKAGE String_References IS > > TYPE String_ptr IS ACCESS ALL String; > > TYPE Const_String_Ptr IS ACCESS CONSTANT String; > > END String_References; > > > > > > Then I created a root_string_container.ads as: > > > > with Bc.Containers; > > with String_References; > > package Root_String_Container is new Bc.Containers > > (String,String_References.String_ptr); > > > > > > (Coping the format of root_container.ads. :-) ) > > > > When I run a semanric check on this later code, I get the following > > message. > > > > root_string_container.ads:4:08: actual for "Item" must be a definite > > subtype. > > See RM 3.3 (23). Basically, an indefinite type is any unconstrained > type (in this case, String is an unconstrained array). A definite type > is a constrained type. > > The problem is that the Ada 95 Booch components are modeled after the > C++ Booch components. Since there is no such thing as an "indefinite > type" in C++, the Ada 95 Booch components restrict you to definite > types. This is one of the advantages of Ada 95 over C++; you can give > more information about the type. On the other hand, a careless library > author can shoot you down. :-) > As a work around, you can use Ada.Strings.Unbounded.Unbounded_String > instead of String. This was my recommendation to another user. > Better would be to fix the Ada 95 Booch components to allow indefinite > types. Find the declaration of Bc.Containers, and add "(<>)" as a > discriminant to the object type. Be aware this might break lots of > stuff; I haven't tried it. This is a possibility, but since the components require the generic type Item to be copyable I don't think it will work? A fix for Lengyel would be to declare type String_ptr_ptr ias access String_ptr; and instantiate with package Root_String_Container is new Bc.Containers (String_References.String_ptr, String_References.String_ptr_ptr); I have in mind that this instantiation with 2 pointers is confusing and tedious, as far as I can see at the moment it's there to support iterators where the iterating procedure can modify the item; function Current_Item (Obj : Iterator) return Item_Ptr; and generic with procedure Apply (Elem_Ref : in Item_Ptr; OK : out Boolean); function Modify (Obj : access Passive_Iterator) return Boolean; I think both of these would be better Ada if they used in out parameters, eg generic with procedure Apply (Elem : in out Item; OK : out Boolean); function Modify (Obj : access Passive_Iterator) return Boolean;