pragmarc_20240810.0.0_fc017aa4/src/pragmarc-b_strings.ads

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
-- PragmAda Reusable Component (PragmARC)
-- Copyright (C) 2021 by PragmAda Software Engineering.  All rights reserved.
-- Released under the terms of the BSD 3-Clause license; see https://opensource.org/licenses
-- **************************************************************************
--
-- Bounded, variable-length strings that are hopefully more usable than
-- Ada.Strings.Bounded provides
-- Modified from an idea by Robert Duff presented on comp.lang.ada
--
-- History:
-- 2021 May 01     J. Carter          V2.1--Adhere to coding standard
-- 2020 Nov 01     J. Carter          V2.0--Initial Ada-12 version
----------------------------------------------------------------------------
-- 2020 Jun 01     J. Carter          V1.4--Use existing Too_Short exception rather than a local exception
-- 2016 Jul 01     J. Carter          V1.3--Made type B_String tagged and non-limited
-- 2016 Mar 15     J. Carter          V1.2--Default discriminant doesn't work as Duff claimed, at least with GNAT
-- 2016 Feb 15     J. carter          V1.1--Forgot "+" for To_B_String
-- 2015 Nov 15     J. Carter          V1.0--Initial release
--
pragma Assertion_Policy (Check);
pragma Unsuppress (All_Checks);

package PragmARC.B_Strings is
   type B_String (Max_Length : Positive := 1024) is tagged limited private;
   -- Default initial value is Null_B_String

   Null_B_String : constant B_String; -- A string of zero characters

   function To_String (Source : in B_String) return String with
      Post => To_String'Result'First = 1 and To_String'Result'Last = Source.Length;
   function "+" (Source : in B_String) return String renames To_String;

   function To_B_String (Source : in String) return B_String with
      Post => To_B_String'Result.Max_Length = Integer'Max (Source'Length, 1);
   function "+" (Source : in String) return B_String renames To_B_String;

   function Length (Source : in B_String) return Natural;

   procedure Assign (To : in out B_String; From : in B_String) with
      Pre  => From.Length <= To.Max_Length or else raise Too_Short,
      Post => To = From;

   procedure Assign (To : in out B_String; From : in String) with
      Pre  => From'Length <= To.Max_Length or else raise Too_Short,
      Post => +To = From;
   -- Same as Assign (To => To, From => +From);

   function "="  (Left : in B_String; Right : in B_String) return Boolean;
   function "<"  (Left : in B_String; Right : in B_String) return Boolean;
   function "<=" (Left : in B_String; Right : in B_String) return Boolean;
   function ">"  (Left : in B_String; Right : in B_String) return Boolean;
   function ">=" (Left : in B_String; Right : in B_String) return Boolean;
private -- PragmARC.B_Strings
   type B_String (Max_Length : Positive := 1024) is tagged limited record
      Len   : Natural := 0;
      Value : String (1 .. Max_Length) := (1 .. Max_Length => ' ');
   end record;

   Null_B_String : constant B_String := (Max_Length => 1, others => <>);
end PragmARC.B_Strings;