Page 1 of 1

Standard Container Library

Posted: Sat Mar 10, 2018 5:49 pm
by Dmitry Dagaev
I'm going to introduce Scl - Standard Container Library. Scl package implements vectors, lists, queues, stacks, maps without any generics. It uses BlackBox Kernel metadata.

Motivation:
1. The same software for the same tasks like sorting or binary search of elements;
2. No generics infrastructure;
3. Simpler solutions as more effective, for example, the stl reference operator[]( size_type pos ) has more overhead.

P.S. (for administration) Stl toppic should be better placed in a separate location Components/Stl .

Re: Standard Container Library

Posted: Sat Mar 10, 2018 5:56 pm
by Dmitry Dagaev
Example - Vectors.Vector

Code: Select all

MyRec = RECORD
   i1: INTEGER;
END;
MyVec = RECORD (Vectors.Vector)
   data*: POINTER TO ARRAY OF MyRec;
END;

Code: Select all

vec.Init(10);
Log.String("Pointer Initial Size,Capacity="); Log.Int(vec.size); Log.Int(vec.capacity); Log.Ln;
mr.i1 := 109; vec.Set(9, mr);
mr.i1 := 110; vec.Set(10, mr);
mr.i1 := 111; vec.Set(11, mr);
Log.String("Pointer To Vector Size,Capacity="); Log.Int(vec.size); Log.Int(vec.capacity); Log.Ln;
FOR j := 0 TO vec.size-1 DO
   Log.Int(j); Log.String(" ="); Log.Int(vec.data[j].i1); Log.Ln;
END;
Vector is resing to 12. Standard elements access vec.data[j] is preferable, than operator[] in c++ case.

From inside it must be mentioned, that vec.data is safely realloced to the new array of type MyRec, using Kernel metadata.

Re: Standard Container Library

Posted: Mon Mar 12, 2018 8:33 am
by Dmitry Dagaev
Example - - Lists.IndexedList

Code: Select all

SearchElem = RECORD (Lists.Elem)
   ri-: Keys.SString32Key;
   i1: INTEGER;
END;
SearchElemPArr = POINTER TO ARRAY OF SearchElem;
MySearchList = RECORD (Lists.IndexedList)
   data*: POINTER TO ARRAY OF SearchElemPArr;
END;
List, Queue, Deque, Stack operate with pointer to array of pointers - POINTER TO ARRAY OF %SearchElemPArr. Calling NEW for arrays is less time-consuming, so internal representation of Lists group uses arrays. Keys.SString32Key means string key for elements comparison. Elements comparison allows making step towards sorting and binary search.

Code: Select all

li.Init(params);
el.ri.name := "orange"; el.i1 := 2; li.PushBack(el);
el.ri.name := "red"; el.i1 := 1; li.PushFront(el);
el.ri.name := "yellow"; el.i1 := 3; li.Insert(Lists.iterNil, el);
el.ri.name := "green"; el.i1 := 4; li.PushBack(el);
el.ri.name := "lightblue"; el.i1 := 5; li.PushBack(el);
el.ri.name := "blue"; el.i1 := 6; li.PushBack(el);
li.Sort;
el.ri.name := "lightblue";
found := li.Find(el, it);
Log.String("lightblue Find="); Log.Bool(found); Log.Int(it.r);  Log.Int(it.c); Log.Ln
So custom lists, queues, stacks can be derived from.