-- 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;