evanescente-ondine

tupplespacepackage-realtupples.adb

May 13th, 2026 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 2.83 KB | Source Code | 0 0
  1. with Ada.Strings.Unbounded, Ada.Unchecked_Deallocation;
  2. use Ada.Strings.Unbounded;
  3.  
  4. package body tupplespacepackage.RealTupples is
  5.     use type Ada.Containers.Count_Type;
  6.     procedure Finalize (Finale: in out FinalizedType) is
  7.         procedure Free is new Ada.Unchecked_Deallocation (Stream_Type, AccessStream);
  8.     begin
  9.         Free (Finale.Stream);
  10.     end Finalize;
  11.  
  12.  ------------------------------------------------------------------
  13.  -- Protected tuple space
  14.  ------------------------------------------------------------------
  15.     protected body RealtuppleSpace is
  16.         procedure Matches (T: Tupple'Class; QueueAccess: out AccessToProtected)  is
  17.         begin
  18.             if not The_Map.Contains (T'Tag) then
  19.                 The_Map.Insert (Key => T'Tag, New_Item => new LockedQueue);
  20.             end if;
  21.             QueueAccess := The_Map.Element(T'Tag);
  22.         end Matches;
  23.         procedure Out_Operation (T: Tupple'Class) is
  24.             M: AccessToProtected;
  25.         begin
  26.             Matches (T, M);
  27.             M.Out_Operation (T);
  28.         end Out_Operation;
  29.         entry In_Operation (Result: out Tupple'Class) when True is
  30.             M: AccessToProtected;
  31.         begin
  32.             Matches (Result, M);
  33.             requeue M.In_Operation with abort;
  34.         end In_Operation;
  35.  
  36.         entry RD_Operation
  37.             (Result  : out Tupple'Class) when True is
  38.             M: AccessToProtected;
  39.         begin
  40.             Matches (Result, M);
  41.             requeue M.RD_Operation with abort;
  42.         end RD_Operation;
  43.  
  44.        procedure Inp_Operation
  45.          (Result  : out Tupple'Class) is
  46.             M: AccessToProtected;
  47.         begin
  48.             Matches (Result, M);
  49.             select
  50.                 M.In_Operation (Result);
  51.             else
  52.                 raise No_Immediate_Message;
  53.             end select;
  54.         end Inp_Operation;
  55.  
  56.         procedure RDP_Operation (Result  : out Tupple'Class) is
  57.             M: AccessToProtected;
  58.         begin
  59.             Matches (Result, M);
  60.             select
  61.                 M.RD_Operation (Result);
  62.             else
  63.                 raise No_Immediate_Message;
  64.             end select;
  65.         end RDP_Operation;
  66.     end RealtuppleSpace;
  67.   ------------------------------------------------------------------
  68.    -- Locked Queue
  69.    ------------------------------------------------------------------
  70.    
  71.    protected body LockedQueue is
  72.  
  73.       procedure Out_Operation (T : Tupple'Class) is
  74.       begin
  75.          PatternQueue.Set_Length (PatternQueue.Length + 1);
  76.          Tupple'Class'Output(PatternQueue.Last_Element.Stream, T);
  77.       end Out_Operation;
  78.  
  79.       entry In_Operation (Result : out Tupple'Class)
  80.         when PatternQueue.Length > 0 is
  81.       begin
  82.          Result := Tupple'Class'Input(PatternQueue.First_Element.Stream);
  83.          PatternQueue.Delete_First;
  84.       end In_Operation;
  85.  
  86.       entry RD_Operation (Result : out Tupple'Class)
  87.         when PatternQueue.Length > 0 is
  88.       begin
  89.          Result := Tupple'Class'Input(PatternQueue.First_Element.Stream);
  90.          Tupple'Class'Output(PatternQueue.First_Element.Stream, Result);
  91.       end RD_Operation;
  92.  
  93.    end LockedQueue;
  94.  
  95. end tupplespacepackage.RealTupples;
Advertisement
Add Comment
Please, Sign In to add comment