--
-- Copyright (C) 2022-2024, Free Software Foundation, Inc.
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--
private with Ada.Finalization;
private generic
type Element_Type (<>) is private;
package SPARK.Containers.Formal.Holders is
type Element_Type_Access is access Element_Type;
type Holder_Type is private;
function Element (Container : Holder_Type) return Element_Type;
-- Return the element held by Container
function Element_Access
(Container : Holder_Type) return not null access Element_Type;
-- Return the stored access.
procedure Replace_Element
(Container : in out Holder_Type;
Element : Element_Type);
-- Replace the Holder's element by Element and do the required
procedure Move (Target, Source : in out Holder_Type);
-- Move the content of the source to the target.
procedure Adjust (Source : in out Holder_Type);
-- Make a copy of Container in order to avoid sharing
procedure Finalize (Container : in out Holder_Type);
-- Finalize the element held by Container if necessary. It is still
-- possible to use a finalized Holder_Type but the former value is lost.
function Is_Null (Container : Holder_Type) return Boolean;
private
type Holder_Type is new Ada.Finalization.Controlled
with record
Element : Element_Type_Access;
end record;
function Is_Null (Container : Holder_Type) return Boolean is
(Container.Element = null);
end SPARK.Containers.Formal.Holders;