AdaPower Logged in as Guest
Ada Tools and Resources

Ada 95 Reference Manual
Ada Source Code Treasury
Bindings and Packages

Join >
Home >
Articles >
Getting Started >
Ada FAQ >
Source Treasury >
Books & Tutorials >
Packages for Reuse >
Latest Additions >
Ada Projects >
Press Releases >
Ada Audio / Video >
Home Pages >
Links >
Contact >
About >
Login >
Zero Size for Access Types (Matthew Heaney)

Zero size for access types are to emphasize that the access type shouldn't be used for anything
other than satisfying the need to have a named type (for the return type of
a function).

For example, in the stack-with-limited-items:

    type Item_Type is limited private;
  package Stacks is

    type Stack_Type is limited private;

    type Item_Access is access all Item_Type;
    for Item_Access'Storage_Size use 0;

    function Push (Stack : access Stack_Type) return Item_Access;

    function Set_Top (Stack : access Stack_Type) return Item_Access;

  end Stacks;

An Ada function declaration must return a named type, so I have to declare
an access type for the return type.  But I only want clients to do this:

    Stack : aliased Stack_Type;
    Push (Stack'Access).all := Value;
    Set_Top (Stack'Access).all := Value;

A client doesn't ever declare an object of type Item_Access -- that type
just happens to be the type returned by the function, which you always
dereference immediately.

Setting the Storage_Size for the access type ensures that no storage
resources are allocated for the type, and it prevents you from using it to
allocate, ie

  IA : Item_Access := new Item_Type'(Value);  -- you're being bad

A good compiler will give you a warning at compile-time that the allocator
will raise Storage_Error at run-time.  (Sadly, there's no way to statically
prevent allocator use.)

The main thing is that the type is there just to satisfy the requirement for
a named type, and to ensure that no storage resources are consumed

(c) 1998-2004 All Rights Reserved David Botton