-- { dg-do compile } with Ada.Containers.Ordered_Maps; with Ada.Tags.Generic_Dispatching_Constructor; package body gen_disp is use type Ada.Tags.Tag; function "<" (L, R : in Ada.Tags.Tag) return Boolean is begin return Ada.Tags.External_Tag (L) < Ada.Tags.External_Tag (R); end "<"; package Char_To_Tag_Map is new Ada.Containers.Ordered_Maps ( Key_Type => Character, Element_Type => Ada.Tags.Tag, "<" => "<", "=" => Ada.Tags. "="); package Tag_To_Char_Map is new Ada.Containers.Ordered_Maps ( Key_Type => Ada.Tags.Tag, Element_Type => Character, "<" => "<", "=" => "="); use type Char_To_Tag_Map.Cursor; use type Tag_To_Char_Map.Cursor; Char_To_Tag : Char_To_Tag_Map.Map; Tag_To_Char : Tag_To_Char_Map.Map; function Get_Object is new Ada.Tags.Generic_Dispatching_Constructor (Root_Type, Ada.Streams.Root_Stream_Type'Class, Root_Type'Input); function Root_Type_Class_Input (S : not null access Ada.Streams.Root_Stream_Type'Class) return Root_Type'Class is External_Tag : constant Character := Character'Input (S); C : constant Char_To_Tag_Map.Cursor := Char_To_Tag.Find (External_Tag); begin return Get_Object (Char_To_Tag_Map.Element (C), S); end Root_Type_Class_Input; end gen_disp;