Ada Programming/Libraries/Ada.Containers.Doubly Linked Lists
This language feature is only available from Ada 2005 on.
Ada.Containers.Doubly_Linked_Lists is a unit of the Predefined Language Environment since Ada 2005.
Introduction
One of the major additions to Ada 2005 is the container library. This library enables the Ada developer to manipulate data structures such as doubly linked lists, maps, sets and vectors. This page will show how the Ada.Containers.Doubly_Linked_Lists library works.
A doubly linked list is merely a linked list where each element is not only linked to the next, but also the previous. For more information, see doubly linked list.
Example
This is example usage is from an existing project.
worm.ads
This file represents the specification of a worm.
withAda.Containers.Doubly_Linked_Lists;withWormlevel, Protocol; -- , Handlers;packageWormisuseWormlevel, Protocol; -- , Handlers;packageWorm_Position_ContainerisnewAda.Containers.Doubly_Linked_Lists(Position);useWorm_Position_Container;typeWorm_Stateis(Alive,Dead,Observing);typeWorm_TypeisrecordWorm_Body : List; Direction : Course := North; Points : Natural := 0; Number : Positive; State : Worm_State := Alive; Full : Boolean := False;endrecord;typeWorm_Type_AccessisaccessWorm_Type;procedureUpdate_Worm (Worm :inWorm_Type_Access; Lvl :inLevel_Access);procedureTurn_Left (Worm :inWorm_Type_Access);procedureTurn_Right (Worm :inWorm_Type_Access);procedureKill (Worm :inWorm_Type_Access);endWorm;
As you can see, Ada.Containers.Doubly_Linked_Lists is instantiated with a type called “Position”. This type represents a tile type in a 2-dimensional array. The worm body is now represented by a doubly linked list, meaning we can loop through each element in either direction, by using the Next and Previous functions.
For those interested, the game can be found at GitHub.
Specification
-- Standard Ada library specification -- Copyright (c) 2003-2018 Maxim Reznik <reznikmm@gmail.com> -- Copyright (c) 2004-2016 AXE Consultants -- Copyright (c) 2004, 2005, 2006 Ada-Europe -- Copyright (c) 2000 The MITRE Corporation, Inc. -- Copyright (c) 1992, 1993, 1994, 1995 Intermetrics, Inc. -- SPDX-License-Identifier: BSD-3-Clause and LicenseRef-AdaReferenceManual -- -------------------------------------------------------------------------generictypeElement_Typeisprivate;withfunction"=" (Left :inElement_Type; Right :inElement_Type)returnBooleanis<>;packageAda.Containers.Doubly_Linked_ListsispragmaPreelaborate (Doubly_Linked_Lists);typeLististaggedprivate;pragmaPreelaborable_Initialization (List);typeCursorisprivate;pragmaPreelaborable_Initialization (Cursor); Empty_List :constantList; No_Element :constantCursor;function"=" (Left :inList; Right :inList)returnBoolean;functionLength (Container :inList)returnCount_Type;functionIs_Empty (Container :inList)returnBoolean;procedureClear (Container :inoutList);functionElement (Position :inCursor)returnElement_Type;procedureReplace_Element (Container :inoutList; Position :inCursor; New_Item :inElement_Type);procedureQuery_Element (Position :inCursor; Process :notnullaccessprocedure(Element :inElement_Type));procedureUpdate_Element (Container :inoutList; Position :inCursor; Process :notnullaccessprocedure(Element :inoutElement_Type));procedureMove (Target :inoutList; Source :inoutList);procedureInsert (Container :inoutList; Before :inCursor; New_Item :inElement_Type; Count :inCount_Type := 1);procedureInsert (Container :inoutList; Before :inCursor; New_Item :inElement_Type; Position :outCursor; Count :inCount_Type := 1);procedureInsert (Container :inoutList; Before :inCursor; Position :outCursor; Count :inCount_Type := 1);procedurePrepend (Container :inoutList; New_Item :inElement_Type; Count :inCount_Type := 1);procedureAppend (Container :inoutList; New_Item :inElement_Type; Count :inCount_Type := 1);procedureDelete (Container :inoutList; Position :inoutCursor; Count :inCount_Type := 1);procedureDelete_First (Container :inoutList; Count :inCount_Type := 1);procedureDelete_Last (Container :inoutList; Count :inCount_Type := 1);procedureReverse_Elements (Container :inoutList);procedureSwap (Container :inoutList; I :inCursor; J :inCursor);procedureSwap_Links (Container :inoutList; I :inCursor; J :inCursor);procedureSplice (Target :inoutList; Before :inCursor; Source :inoutList);procedureSplice (Target :inoutList; Before :inCursor; Source :inoutList; Position :inoutCursor);procedureSplice (Container :inoutList; Before :inCursor; Position :inCursor);functionFirst (Container :inList)returnCursor;functionFirst_Element (Container :inList)returnElement_Type;functionLast (Container :inList)returnCursor;functionLast_Element (Container :inList)returnElement_Type;functionNext (Position :inCursor)returnCursor;functionPrevious (Position :inCursor)returnCursor;procedureNext (Position :inoutCursor);procedurePrevious (Position :inoutCursor);functionFind (Container :inList; Item :inElement_Type; Position :inCursor := No_Element)returnCursor;functionReverse_Find (Container :inList; Item :inElement_Type; Position :inCursor := No_Element)returnCursor;functionContains (Container :inList; Item :inElement_Type)returnBoolean;functionHas_Element (Position :inCursor)returnBoolean;procedureIterate (Container :inList; Process :notnullaccessprocedure(Position :inCursor));procedureReverse_Iterate (Container :inList; Process :notnullaccessprocedure(Position :inCursor));genericwithfunction"<" (Left :inElement_Type; Right :inElement_Type)returnBooleanis<>;packageGeneric_SortingisfunctionIs_Sorted (Container :inList)returnBoolean;procedureSort (Container :inoutList);procedureMerge (Target :inoutList; Source :inoutList);endGeneric_Sorting;privatetypeLististaggednullrecord; Empty_List :constantList := (nullrecord);typeCursorisnullrecord; No_Element :constantCursor := (nullrecord);endAda.Containers.Doubly_Linked_Lists;
See also
Wikibook
External examples
- Search for examples of
Ada.Containers.Doubly_Linked_Listsin: Rosetta Code, GitHub (gists), any Alire crate or this Wikibook. - Search for posts related to
Ada.Containers.Doubly_Linked_Listsin: Stack Overflow, comp.lang.ada or any Ada related page.
Ada Reference Manual
Ada 2005
Ada 2012
Open-Source Implementations
FSF GNAT
- Specification: a-cdlili.ads
- Body: a-cdlili.adb
drake
- Specification: containers/a-cdlili.ads
- Body: containers/a-cdlili.adb