Browse Source

* Initial check-in of stl

git-svn-id: trunk@17233 -
michael 14 years ago
parent
commit
a33e5eb0eb
46 changed files with 5834 additions and 0 deletions
  1. 45 0
      .gitattributes
  2. 2427 0
      packages/fcl-stl/Makefile
  3. 23 0
      packages/fcl-stl/Makefile.fpc
  4. 47 0
      packages/fcl-stl/doc/arrayutils.tex
  5. 81 0
      packages/fcl-stl/doc/deque.tex
  6. 24 0
      packages/fcl-stl/doc/dequeexample.pp
  7. 63 0
      packages/fcl-stl/doc/main.tex
  8. 263 0
      packages/fcl-stl/doc/makra.tex
  9. 87 0
      packages/fcl-stl/doc/map.tex
  10. 24 0
      packages/fcl-stl/doc/mapexample.pp
  11. 44 0
      packages/fcl-stl/doc/priorityqueue.tex
  12. 30 0
      packages/fcl-stl/doc/priorityqueueexample.pp
  13. 39 0
      packages/fcl-stl/doc/queue.tex
  14. 17 0
      packages/fcl-stl/doc/queueexample.pp
  15. 76 0
      packages/fcl-stl/doc/set.tex
  16. 24 0
      packages/fcl-stl/doc/setexample.pp
  17. 20 0
      packages/fcl-stl/doc/sortingexample.pp
  18. 39 0
      packages/fcl-stl/doc/stack.tex
  19. 17 0
      packages/fcl-stl/doc/stackexample.pp
  20. 9 0
      packages/fcl-stl/doc/util.tex
  21. 73 0
      packages/fcl-stl/doc/vector.tex
  22. 21 0
      packages/fcl-stl/doc/vectorexample.pp
  23. 215 0
      packages/fcl-stl/src/garrayutils.pp
  24. 192 0
      packages/fcl-stl/src/gdeque.pp
  25. 72 0
      packages/fcl-stl/src/ghashset.pp
  26. 151 0
      packages/fcl-stl/src/gmap.pp
  27. 129 0
      packages/fcl-stl/src/gpriorityqueue.pp
  28. 63 0
      packages/fcl-stl/src/gqueue.pp
  29. 411 0
      packages/fcl-stl/src/gset.pp
  30. 61 0
      packages/fcl-stl/src/gstack.pp
  31. 27 0
      packages/fcl-stl/src/gutil.pp
  32. 161 0
      packages/fcl-stl/src/gvector.pp
  33. 2 0
      packages/fcl-stl/tests/clean
  34. 55 0
      packages/fcl-stl/tests/gdequetest.pp
  35. 84 0
      packages/fcl-stl/tests/gmaptest.pp
  36. 84 0
      packages/fcl-stl/tests/gmaptestzal.pp
  37. 47 0
      packages/fcl-stl/tests/gpriorityqueuetest.pp
  38. 43 0
      packages/fcl-stl/tests/gqueuetest.pp
  39. 59 0
      packages/fcl-stl/tests/gsetrefcounttest.pp
  40. 110 0
      packages/fcl-stl/tests/gsettest.pp
  41. 52 0
      packages/fcl-stl/tests/gsorttest.pp
  42. 43 0
      packages/fcl-stl/tests/gstacktest.pp
  43. 111 0
      packages/fcl-stl/tests/gvectortest.pp
  44. 4 0
      packages/fcl-stl/tests/run-all-tests
  45. 27 0
      packages/fcl-stl/tests/suiteconfig.pp
  46. 138 0
      packages/fcl-stl/tests/testrunner.pp

+ 45 - 0
.gitattributes

@@ -2295,6 +2295,51 @@ packages/fcl-res/xml/versionconsts.xml svneol=native#text/plain
 packages/fcl-res/xml/versionresource.xml svneol=native#text/plain
 packages/fcl-res/xml/versiontypes.xml svneol=native#text/plain
 packages/fcl-res/xml/winpeimagereader.xml svneol=native#text/plain
+packages/fcl-stl/Makefile svneol=native#text/plain
+packages/fcl-stl/Makefile.fpc svneol=native#text/plain
+packages/fcl-stl/doc/arrayutils.tex svneol=native#text/plain
+packages/fcl-stl/doc/deque.tex svneol=native#text/plain
+packages/fcl-stl/doc/dequeexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/main.tex svneol=native#text/plain
+packages/fcl-stl/doc/makra.tex svneol=native#text/plain
+packages/fcl-stl/doc/map.tex svneol=native#text/plain
+packages/fcl-stl/doc/mapexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/priorityqueue.tex svneol=native#text/plain
+packages/fcl-stl/doc/priorityqueueexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/queue.tex svneol=native#text/plain
+packages/fcl-stl/doc/queueexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/set.tex svneol=native#text/plain
+packages/fcl-stl/doc/setexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/sortingexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/stack.tex svneol=native#text/plain
+packages/fcl-stl/doc/stackexample.pp svneol=native#text/plain
+packages/fcl-stl/doc/util.tex svneol=native#text/plain
+packages/fcl-stl/doc/vector.tex svneol=native#text/plain
+packages/fcl-stl/doc/vectorexample.pp svneol=native#text/plain
+packages/fcl-stl/src/garrayutils.pp svneol=native#text/plain
+packages/fcl-stl/src/gdeque.pp svneol=native#text/plain
+packages/fcl-stl/src/ghashset.pp svneol=native#text/plain
+packages/fcl-stl/src/gmap.pp svneol=native#text/plain
+packages/fcl-stl/src/gpriorityqueue.pp svneol=native#text/plain
+packages/fcl-stl/src/gqueue.pp svneol=native#text/plain
+packages/fcl-stl/src/gset.pp svneol=native#text/plain
+packages/fcl-stl/src/gstack.pp svneol=native#text/plain
+packages/fcl-stl/src/gutil.pp svneol=native#text/plain
+packages/fcl-stl/src/gvector.pp svneol=native#text/plain
+packages/fcl-stl/tests/clean svneol=native#text/plain
+packages/fcl-stl/tests/gdequetest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gmaptest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gmaptestzal.pp svneol=native#text/plain
+packages/fcl-stl/tests/gpriorityqueuetest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gqueuetest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gsetrefcounttest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gsettest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gsorttest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gstacktest.pp svneol=native#text/plain
+packages/fcl-stl/tests/gvectortest.pp svneol=native#text/plain
+packages/fcl-stl/tests/run-all-tests svneol=native#text/plain
+packages/fcl-stl/tests/suiteconfig.pp svneol=native#text/plain
+packages/fcl-stl/tests/testrunner.pp svneol=native#text/plain
 packages/fcl-web/Makefile svneol=native#text/plain
 packages/fcl-web/Makefile.fpc svneol=native#text/plain
 packages/fcl-web/Makefile.org svneol=native#text/plain

+ 2427 - 0
packages/fcl-stl/Makefile

@@ -0,0 +1,2427 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/03/21]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx haiku
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifndef DARWIN2DARWIN
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=fcl-stl
+override PACKAGE_VERSION=2.5.1
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+ifeq ($(OS_TARGET),NativeNT)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=nativent
+endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) c$(TAROPT)f $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_PROGRAMS
+override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 23 - 0
packages/fcl-stl/Makefile.fpc

@@ -0,0 +1,23 @@
+#
+#   Makefile.fpc for Free Component Library
+#
+
+[package]
+name=fcl-stl
+version=2.5.1
+
+[target]
+units=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[compiler]
+options=-S2h
+sourcedir=src
+
+[rules]
+.NOTPARALLEL:

+ 47 - 0
packages/fcl-stl/doc/arrayutils.tex

@@ -0,0 +1,47 @@
+\chapter{TArrayUtils}
+
+Set of utilities for manipulating arrays data.
+
+Takes 3 arguements for specialization. First one is type of array (can be anything, which is
+accesible by [] operator, e. g. ordinary array, vector, ...), second one is type of array element.
+
+%Usage example for sorting:
+
+%\lstinputlisting[language=Pascal]{sortingexample.pp}
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!procedure RandomShuffle(arr: TArr, size:SizeUint)! &
+O(N)\\ \hline
+\multicolumn{2}{|m{15cm}|}{Shuffles elements in array in random way} \\\hline\hline
+
+\end{longtable}\chapter{TOrderingArrayUtils}
+
+Set of utilities for manipulating arrays data.
+
+Takes 3 arguements for specialization. First one is type of array (can be anything, which is
+accesible by [] operator, e. g. ordinary array, vector, ...), second one is type of array element,
+third one is comparator class (see TPriorityQueue for definition of comparator class).
+
+Usage example for sorting:
+
+\lstinputlisting[language=Pascal]{sortingexample.pp}
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!procedure Sort(arr: TArr, size:SizeUint)! &
+O(N log N) average and worst case. Uses QuickSort, backed up by HeapSort, when QuickSort ends up in
+using too much recursion.\\ \hline
+\multicolumn{2}{|m{15cm}|}{Sort array arr, with specified size. Array indexing should be 0 based.} \\\hline\hline
+
+\end{longtable}

+ 81 - 0
packages/fcl-stl/doc/deque.tex

@@ -0,0 +1,81 @@
+\chapter{TDeque}
+
+Implements selfresizing array. Indexing is 0-based.
+Also implement constant time insertion from front.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{dequeexample.pp}
+
+Memory complexity:
+Uses at most 3times bigger memory than maximal array size (this is only case during reallocation).
+Normal consumption is at most twice as maximal array size.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty array.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns size of array.} \\\hline\hline
+
+\verb!procedure PushBack(value: T)! &  Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time. \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts at the end of array (increases size by 1)} \\\hline\hline
+
+\verb!procedure PopBack()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the end of array (decreases size by 1). When array
+is empty, does nothing.} \\\hline\hline
+
+\verb!procedure PushFront(value: T)! &  Same as PushBack. \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts at the beginning of array (increases size by 1)} \\\hline\hline
+
+\verb!procedure PopFront()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the beginning of array (decreases size by 1). When array
+is empty, does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when array is empty} \\\hline\hline
+
+\verb!procedure Insert(position: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Inserts value at position. When position is greater than size, puts value
+at the end of array.} \\\hline\hline
+
+\verb!procedure Erase(positine: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Erases element from position. When position is outside of array does
+nothing.} \\\hline\hline
+
+\verb!procedure Clear! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Clears array (set size to zero). But doesn't free memory used by array.}
+\\\hline\hline
+
+\verb!function Front: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns first element from array.} \\\hline\hline
+
+\verb!function Back: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns last element from array.} \\\hline\hline
+
+\verb!procedure Resize(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Changes size of array to num. Doesn't guarantte anything about value of
+newly alocated elements.} \\\hline\hline
+
+\verb!procedure Reserve(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Alocates at least num elements for array. Usefull when you want to
+pushback big number of elements and want to avoid frequent reallocation.} \\\hline\hline
+
+\verb!property item[i: SizeUInt]: T; default;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Property for accessing i-th element in array. Can be used just by square
+brackets (its default property).} \\\hline\hline
+
+\verb!property mutable[i: SizeUInt]: T;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns pointer to i-th element in array. Usefull when you store records.} \\\hline
+
+
+
+\end{longtable}

+ 24 - 0
packages/fcl-stl/doc/dequeexample.pp

@@ -0,0 +1,24 @@
+uses gdeque;
+
+type TDequelli = specialize TDeque<longint>;
+
+var Buffer:TDequelli; i:longint;
+
+begin
+  Buffer := TDequelli.Create;
+  {Push 5 elements at the end of array}
+  for i:=1 to 5 do
+    Buffer.PushBack(i);
+  {change 3rd element to 47}
+  Buffer[2] := 47;
+  {pop last element}
+  Buffer.PopBack;
+  {push 3 element to front}
+  for i:=1 to 3 do
+    Buffer.PushFront(i*10);
+  {print all elements}
+  for i:=0 to Buffer.Size-1 do
+    writeln(Buffer[i]);
+
+  Buffer.Destroy;
+end.

+ 63 - 0
packages/fcl-stl/doc/main.tex

@@ -0,0 +1,63 @@
+
+%% Template by Michal Forisek
+
+
+\documentclass[a4paper]{report}
+\usepackage[utf8]{inputenc}
+\usepackage{a4wide}
+\usepackage{tabularx}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+\usepackage{amsmath}
+\usepackage{epsfig}
+\usepackage{color}
+\usepackage{mathrsfs}
+\usepackage{verbatim}
+\usepackage{hyperref}
+\usepackage{subfigure}
+\usepackage{float}
+\usepackage{listings}
+\usepackage{longtable}
+\input{makra.tex}
+
+\renewcommand{\chaptername}{}
+\renewcommand{\thechapter}{}
+
+\begin{document}
+
+\thispagestyle{empty}
+\vfill
+\vfill
+\begin{center}
+\begin{minipage}{0.8\textwidth}
+\hrule
+\bigskip\bigskip
+\centerline{\LARGE\sc FreePascal generic container library}
+\smallskip
+\centerline{(manual)}
+\smallskip
+\centerline{\url{http://code.google.com/p/stlpascal}}
+\bigskip
+\bigskip
+\bigskip\bigskip
+\hrule
+\end{minipage}
+\end{center}
+\vfill
+{~}
+\hfill version 1.0
+\eject % EOP i
+
+\tableofcontents
+
+\input{vector.tex}
+\input{stack.tex}
+\input{deque.tex}
+\input{queue.tex}
+\input{util.tex}
+\input{priorityqueue.tex}
+\input{arrayutils.tex}
+\input{set.tex}
+\input{map.tex}
+
+\end{document}

+ 263 - 0
packages/fcl-stl/doc/makra.tex

@@ -0,0 +1,263 @@
+% vim: set fdm=marker:
+%% Original by Michal Forisek
+
+
+%% zakladne definicie
+\newcommand{\quoteme}[1]{\clqq#1\crqq}
+\def\todo#1{[{\color{red} TODO:} {\bf  #1}]}
+\def\fixme#1{[{\color{red} FIXME:} {\bf  #1}]}
+\def\verify#1{\todo{verify: #1}}
+
+\def\xor{\oplus}
+\def\concat{\|}
+%\def\inr{\in_{R}}
+\def\toa #1 {\overset{#1}{\rightarrow}}
+\def\inr{\overset{\$}{\leftarrow}}
+\def\assign{\leftarrow}
+\def\send{\rightarrow}
+\def\isomorph{\cong}
+\def\nsd{NSD}
+\def\union{\cup}
+\newcommand{\unit}[1]{\ensuremath{\, \mathrm{#1}}}
+\DeclareMathOperator{\dlog}{dlog}
+
+\def\compactlist{
+  \setlength{\itemsep}{1pt}
+  \setlength{\parskip}{0pt}
+  \setlength{\parsep}{0pt}
+}
+\def\mod{\,{\rm mod}\,}
+
+%%% original od Misofa:
+%% {{{
+
+\catcode`\@=11
+
+\def\R{{\cal R}}
+\def\cent{{c\kern-0.3em|\kern0.1em}}
+\def\N{{N}} % FIXME FIXME 
+
+\let\eps=\varepsilon
+
+\def\relupdown#1#2#3{\mathrel{\mathop{#1}\limits^{#2}_{#3}} }
+
+\let\then=\Rightarrow
+\let\neht=\Leftarrow
+
+\def\krok#1{\relupdown{\Longrightarrow}{}{#1}}
+\def\thenrm{\relupdown{\Longrightarrow}{}{rm}}
+
+\def\bicik{\upharpoonright}
+\def\B{{\mathbf B}}
+\def\kodTS#1{{\tt <}#1{\tt >}}
+
+\newtheorem{definicia}{Definícia}[section]
+\newtheorem{HLPpoznamka}{Poznámka}[section]
+\newtheorem{HLPpriklad}{Príklad}[section]
+\newtheorem{HLPcvicenie}[HLPpriklad]{Cvičenie}
+\newtheorem{zadanie}{Úloha}[section]
+\newenvironment{poznamka}{\begin{HLPpoznamka}\rm}{\end{HLPpoznamka}}
+\newenvironment{priklad}{\begin{HLPpriklad}\rm}{\end{HLPpriklad}}
+\newenvironment{cvicenie}{\begin{HLPcvicenie}\rm}{\end{HLPcvicenie}}
+\newtheorem{veta}{Veta}[section]
+\newtheorem{lema}[veta]{Lema}
+\newtheorem{dosledok}[veta]{Dôsledok}
+\newtheorem{teza}[veta]{Téza}
+% \newtheorem{dokaz}{Dôkaz}[section]
+
+\long\def\odsadene#1{
+\leftskip=\parindent
+\parindent=0pt
+\vskip-5pt
+
+\parskip=5pt
+#1
+\parskip=0pt
+
+\parindent=\leftskip
+\leftskip=0pt
+
+} % end \odsadene
+
+
+
+
+%%%%%%%%%%% PROSTREDIE PRE PISANIE KOMENTAROV
+
+%\newenvironment{komentar}{%
+%\vskip\baselineskip
+%\tabularx{0.95\textwidth}{|X|}
+%\sl
+%}
+%{\endtabularx
+%\vskip\baselineskip
+%}
+
+\newenvironment{komentar}{%
+\vskip\baselineskip\noindent
+\tabularx{\textwidth}{>{\hsize=.2\hsize}X>{\hsize=1.8\hsize}X}
+\sl ~ & \sl
+}
+{\endtabularx
+\vskip\baselineskip
+}
+
+%\newenvironment{komentar}{%
+%\vskip\baselineskip
+%\trivlist\vspace{-4pt}\raggedleft\item\relax\tabularx{0.9\textwidth}{X}\sl}
+%{\endtabularx\vspace{-4pt}\endtrivlist
+%\vskip\baselineskip
+%}
+
+\newenvironment{dokaz}{\trivlist
+  \item[\hskip \labelsep{\bfseries Dôkaz.}]}{\endtrivlist}
+  
+%\newenvironment{dokaz}{%
+%\vskip\baselineskip\noindent
+%\tabularx{\textwidth}{||X||}
+%\sl
+%}
+%{\endtabularx
+%\vskip\baselineskip
+%}
+
+%%%%%%%%%%% PROSTREDIE PRE MOJE ITEMIZE 
+
+\newenvironment{myitemize}{%
+\begin{itemize}
+\itemsep-3pt
+}
+{\end{itemize}
+}
+
+%%%%%%%%%%% MATICKE MAKRA
+
+\font\tenrm=csr10
+
+\def\eps{\varepsilon}
+% \def\R{{\mathbb R}}
+\def\lvec#1{\overrightarrow{#1}}
+\def\uhol{{\measuredangle}}
+\def\then{\Rightarrow}
+% \def\lg{{\rm lg}}
+\def\lg{\log_2}
+%\def\div{\mathbin{\rm div}}
+\def\div{{\rm div}}
+
+%%%%%%%%%%% PDF
+
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+  \pdffalse
+\else
+  \pdfoutput=1 \pdftrue
+\fi
+
+%%%%%%%%%%% OBRAZKY 
+
+\newcommand{\myincludegraphics}[2][]{\includegraphics[#1]{images/#2}}
+
+%%%%%%%%%%% SLOVNICEK
+
+\openout2=\jobname.slo
+
+\newcommand{\definuj}[3][]{%
+\def\tmpvoid{}\def\tmpfirst{#1}%
+\ifx\tmpvoid\tmpfirst%
+  {\sl #2}\label{definicia:#2}\write2{#2 & #3 & \pageref{definicia:#2} \cr}%
+\else%
+  {\sl #2}\label{definicia:#2}\write2{#1 & #3 & \pageref{definicia:#2} \cr}%
+\fi}
+
+\newcommand{\definujsilent}[2]{%
+\label{definicia:#1}\write2{#1 & #2 & \pageref{definicia:#1} \cr}%
+}
+
+\newcommand\myglossary{
+  \immediate\closeout2 
+  %\if@twocolumn\@restonecoltrue\onecolumn\else\@restonecolfalse\fi
+  \chapter{Slovníček pojmov}
+  \begin{tabular}{|l|l|r|}
+  \hline
+  {\bfseries slovenský pojem} & {\bfseries anglický preklad} & {\bfseries str.} \\ 
+  \hline
+  \InputIfFileExists{\jobname.srs}{}{~ & ~ & ~ \\}
+  \hline
+  \end{tabular}
+  %\if@restonecol\twocolumn\fi
+}
+
+%%%%%%%%%%% UVODZOVKY
+
+\catcode`\"=13
+\def "{\begingroup\clqq\def "{\endgroup\crqq}}
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~\do\"}
+
+%%%%%%%%%%% DANGER BENDS 
+
+\font\manual=manfnt % font used for the METAFONT logo, etc.
+\def\dbend{{\manual\char127}} % dangerous bend sign
+
+\newlength{\bendwidth}   \settowidth{\bendwidth}{\dbend}    \newlength{\hangwidth}
+
+\def\hangone{%
+  \hangwidth=\bendwidth%
+  \advance\hangwidth 5pt%
+  \hangindent\hangwidth%
+}
+\def\hangtwo{%
+  \hangwidth=\bendwidth%
+  \multiply\hangwidth 2%
+  \advance\hangwidth 6pt% 
+  \hangindent\hangwidth%
+}
+
+\def\medbreak{\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi}
+\let\endgraf=\par
+
+\def\d@nger{\medbreak\begingroup\clubpenalty=10000
+%\def\d@nger{\begingroup\clubpenalty=10000
+%  \def\par{\endgraf\endgroup\medbreak} \noindent\hangone\hangafter=-2
+  \def\par{\endgraf\endgroup} \noindent\hangone\hangafter=-2
+  \hbox to0pt{\hskip-\hangindent\dbend\hfill}}
+\outer\def\danger{\d@nger}
+
+\def\dd@nger{\medbreak\begingroup\clubpenalty=10000
+%  \def\par{\endgraf\endgroup\medbreak} \noindent\hangtwo\hangafter=-2
+  \def\par{\endgraf\endgroup} \noindent\hangtwo\hangafter=-2
+  \hbox to0pt{\hskip-\hangindent\dbend\kern1pt\dbend\hfill}}
+\outer\def\ddanger{\dd@nger}
+
+\def\enddanger{\endgraf\endgroup} % omits the \medbreak
+\def\enddangerhop{\endgraf\endgroup\medbreak}
+
+
+
+
+\def\@nakedcite#1#2{{#1\if@tempswa , #2\fi}}
+\DeclareRobustCommand\nakedcite{%
+  \@ifnextchar [{\@tempswatrue\@nakedcitex}{\@tempswafalse\@nakedcitex[]}}
+\def\@nakedcitex[#1]#2{%
+  \let\@citea\@empty
+  \@nakedcite{\@for\@citeb:=#2\do
+    {\@citea\def\@citea{,\penalty\@m\ }%
+     \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+     \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
+     \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}%
+       \G@refundefinedtrue
+       \@latex@warning
+         {Citation `\@citeb' on page \thepage \space undefined}}%
+       {\hbox{\csname b@\@citeb\endcsname}} }}{#1}}
+
+\long\def\FIXME#1{
+  \begin{center}
+  \begin{minipage}{0.8\textwidth}
+  {\bf FIXME:~}\sl #1
+  \end{minipage}
+  \end{center}
+}
+
+
+\catcode`\@=12
+%% }}}

+ 87 - 0
packages/fcl-stl/doc/map.tex

@@ -0,0 +1,87 @@
+\chapter{TMap}
+
+Implements container for ordered associative array with unique keys.
+Takes 3 arguments for specialization, first one is type of keys, second one is type of values, third
+one is comparator class for keys.
+Usage example:
+
+\lstinputlisting[language=Pascal]{mapexample.pp}
+
+Some methods return type TMSet.PNode. Usefull fields are Data.Key, Data.Value, for retrieving
+actual Key and Value from node. This node can be also used for navigation between elements by methods of set class.
+You can also change value in node (but not key).
+(But don't do anything else with it, you can lose data integrity.)
+
+Memory complexity:
+Size of stored base + constant overhead for each stored element (3 pointers + one boolean).
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty map.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in map.} \\\hline\hline
+
+\verb!procedure Insert(key: TKey; value: TValue)! &
+O(lg N), N is number of elements in map \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts key value pair into map. If key was already there, it will have
+new value assigned.} \\\hline\hline
+
+\verb!procedure Delete(key: TKey)! &
+O(lg N) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Deletes key (and associated value) from map. If element is not in map, nothing happens.} \\\hline\hline
+
+\verb!function Find(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for key in map. If value is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindLess(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindLessEqual(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less or equal than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindGreater(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindGreaterEqual(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater or equal than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function Min:TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing smallest key of map. If map is empty returns
+nil.} \\\hline\hline
+
+\verb!function Max:TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing largest key of map. If map is empty returns
+nil.} \\\hline\hline
+
+\verb!function Next(x:TMSet.PNode):TMSet.PNode! & O(lg N) worst case, but traversal from smallest element to
+largest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns successor of x. If x is largest key of map, returns nil.} \\\hline\hline
+
+\verb!function Prev(x:TMSet.PNode):TMSet.PNode! & O(lg N) worst case, but traversal from largest element to
+smallest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns predecessor of x. If x is smallest key of map, returns nil.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when map is empty.} \\\hline
+
+\verb!function GetValue(key:TKey):TValue! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns value associated with key. Is key isn't in map crashes.} \\\hline
+
+\verb!property item[i: Key]: TValue; default;! & O(ln N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Property for accessing key i in map. Can be used just by square
+brackets (its default property).} \\\hline\hline
+
+
+\end{longtable}

+ 24 - 0
packages/fcl-stl/doc/mapexample.pp

@@ -0,0 +1,24 @@
+uses gmap, gutil;
+
+type lesslli=specialize TLess<longint>;
+     maplli=specialize TMap<longint, longint, lesslli>;
+
+var data:maplli; i:longint; iterator:maplli.TMSet.PNode;
+
+begin
+  data:=maplli.Create;
+
+  for i:=0 to 10 do
+    data[i]:=10*i;
+
+  {Iteration through elements}
+  iterator:=data.Min;
+  while iterator<>nil do begin
+    writeln(iterator^.Data.Key, ' ', iterator^.Data.Value);
+    iterator:=data.next(iterator);
+  end;
+
+  writeln(data.FindLess(7)^.Data.Value);
+
+  data.Destroy;
+end.

+ 44 - 0
packages/fcl-stl/doc/priorityqueue.tex

@@ -0,0 +1,44 @@
+\chapter{TPriorityQueue}
+
+Implements priority queue. It's container which allow insertions of elements and then retrieval of
+the biggest one.
+
+For specialization it needs two arguements. First is the type T of stored element. Second one is type
+comparator class, which should have class function \verb!c(a,b: T):boolean! which return true, when
+a is stricly less then b (or in other words, a should be poped out after b).
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{priorityqueueexample.pp}
+
+Memory complexity:
+Since underlaying structure is TVector, memory complexity is same.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty priority queue.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in priority queue.} \\\hline\hline
+
+\verb!procedure Push(value: T)! &  Amortized
+O(lg N), some operations might take O(N) time, when underlaying array needs to be reallocated, but sequence of N
+operations takes O(N lg N) time. \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element at the back of queue.} \\\hline\hline
+
+\verb!procedure Pop()! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes the biggest element from queue. If queue is empty does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when queue is empty.} \\\hline\hline
+
+\verb!function Top: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns the biggest element from queue.} \\\hline
+
+\end{longtable}

+ 30 - 0
packages/fcl-stl/doc/priorityqueueexample.pp

@@ -0,0 +1,30 @@
+{$mode objfpc}
+
+uses gpriorityqueue;
+
+type
+  lesslli = class
+    public
+    class function c(a,b: longint):boolean;inline;
+  end;
+
+class function lesslli.c(a,b: longint):boolean;inline;
+begin
+  c:=a<b;
+end;
+
+type priorityqueuelli = specialize TPriorityQueue<longint, lesslli>;
+
+var data:priorityqueuelli; i:longint;
+
+begin
+  data:=priorityqueuelli.Create;
+  for i:=1 to 10 do
+    data.Push(random(1000));
+  while not data.IsEmpty do begin
+    writeln(data.Top);
+    data.Pop;
+  end;
+
+  data.Destroy;
+end.

+ 39 - 0
packages/fcl-stl/doc/queue.tex

@@ -0,0 +1,39 @@
+\chapter{TQueue}
+
+Implements queue.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{queueexample.pp}
+
+Memory complexity:
+Since underlaying structure is TDeque, memory complexity is same.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty queue.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in queue.} \\\hline\hline
+
+\verb!procedure Push(value: T)! &  Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element at the back of queue.} \\\hline\hline
+
+\verb!procedure Pop()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the beginning of queue. If queue is empty does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when queue is empty.} \\\hline\hline
+
+\verb!function Front: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns the first element from queue.} \\\hline
+
+\end{longtable}

+ 17 - 0
packages/fcl-stl/doc/queueexample.pp

@@ -0,0 +1,17 @@
+uses gqueue;
+
+type queuelli = specialize TQueue<longint>;
+
+var data:queuelli; i:longint;
+
+begin
+  data:=queuelli.Create;
+  for i:=1 to 10 do
+    data.Push(10*i);
+  while not data.IsEmpty do begin
+    writeln(data.Front);
+    data.Pop;
+  end;
+
+  data.Destroy;
+end.

+ 76 - 0
packages/fcl-stl/doc/set.tex

@@ -0,0 +1,76 @@
+\chapter{TSet}
+
+Implements container for storing ordered set of unique elements.
+Takes 2 arguments for specialization, first one is type of elements, second one is comparator class.
+Usage example:
+
+\lstinputlisting[language=Pascal]{setexample.pp}
+
+Some methods return type of PNode. It has field Data, which can be used for retrieving data from
+that node. This node can be also used for navigation between elements by methods of set class.
+(But don't do anything else with it, you can lose data integrity.)
+
+Memory complexity:
+Size of stored base + constant overhead for each stored element (3 pointers + one boolean).
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty set.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in set.} \\\hline\hline
+
+\verb!procedure Insert(value: T)! &
+O(lg N), N is number of elements in set \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element into set.} \\\hline\hline
+
+\verb!procedure Delete(value: T)! &
+O(lg N), N is number of elements in set \\ \hline
+\multicolumn{2}{|m{15cm}|}{Deletes value from set. If element is not in set, nothing happens.} \\\hline\hline
+
+\verb!function Find(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for value in set. If value is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindLess(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindLessEqual(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less or equal than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindGreater(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindGreaterEqual(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater or equal than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function Min:PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing smallest element of set. If set is empty returns
+nil.} \\\hline\hline
+
+\verb!function Max:PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing largest element of set. If set is empty returns
+nil.} \\\hline\hline
+
+\verb!function Next(x:PNode):PNode! & O(lg N) worst case, but traversal from smallest element to
+largest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns successor of x. If x is largest element of set, returns nil.} \\\hline\hline
+
+\verb!function Prev(x:PNode):PNode! & O(lg N) worst case, but traversal from largest element to
+smallest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns predecessor of x. If x is smallest element of set, returns nil.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when set is empty.} \\\hline
+
+\end{longtable}

+ 24 - 0
packages/fcl-stl/doc/setexample.pp

@@ -0,0 +1,24 @@
+uses gset, gutil;
+
+type lesslli=specialize TLess<longint>;
+     setlli=specialize TSet<longint, lesslli>;
+
+var data:setlli; i:longint; iterator:setlli.PNode;
+
+begin
+  data:=setlli.Create;
+
+  for i:=0 to 10 do
+    data.insert(i);
+
+  {Iteration through elements}
+  iterator:=data.Min;
+  while iterator<>nil do begin
+    writeln(iterator^.Data);
+    iterator:=data.next(iterator);
+  end;
+
+  writeln(data.FindLess(7)^.Data);
+
+  data.Destroy;
+end.

+ 20 - 0
packages/fcl-stl/doc/sortingexample.pp

@@ -0,0 +1,20 @@
+uses garrayutils, gutil, gvector;
+
+type vectorlli = specialize TVector<longint>;
+     lesslli = specialize TLess<longint>;
+     sortlli = specialize TOrderingArrayUtils<vectorlli, longint, lesslli>;
+
+var data:vectorlli; n,i:longint;
+
+begin
+  randomize;
+  data:=vectorlli.Create;
+  read(n);
+  for i:=1 to n do
+    data.pushback(random(1000000000));
+  sortlli.sort(data, data.size());
+  for i:=1 to n do
+    writeln(data[i-1]);
+
+  data.Destroy;
+end.

+ 39 - 0
packages/fcl-stl/doc/stack.tex

@@ -0,0 +1,39 @@
+\chapter{TStack}
+
+Implements stack.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{stackexample.pp}
+
+Memory complexity:
+Since underlaying structure is TVector, memory complexity is same.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty stack.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in stack.} \\\hline\hline
+
+\verb!procedure Push(value: T)! &  Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element on the top of stack.} \\\hline\hline
+
+\verb!procedure Pop()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the top of stack. If stack is empty does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when stack is empty} \\\hline\hline
+
+\verb!function Top: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns top element from stack.} \\\hline
+
+\end{longtable}

+ 17 - 0
packages/fcl-stl/doc/stackexample.pp

@@ -0,0 +1,17 @@
+uses gstack;
+
+type stacklli = specialize TStack<longint>;
+
+var data:stacklli; i:longint;
+
+begin
+  data:=stacklli.Create;
+  for i:=1 to 10 do
+    data.Push(10*i);
+  while not data.IsEmpty do begin
+    writeln(data.Top);
+    data.Pop;
+  end;
+
+  data.Destroy;
+end.

+ 9 - 0
packages/fcl-stl/doc/util.tex

@@ -0,0 +1,9 @@
+\chapter{TLess, TGreater}
+
+Comparators classes. Can be used in PriorityQueue and Sorting as comparator functions.
+TLess is used for ordering from smallest element to largest, TGreater is used for oposite ordering.
+
+%Usage example:
+
+%\lstinputlisting[language=Pascal]{queueexample.pp}
+

+ 73 - 0
packages/fcl-stl/doc/vector.tex

@@ -0,0 +1,73 @@
+\chapter{TVector}
+
+Implements selfresizing array. Indexing is 0-based.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{vectorexample.pp}
+
+Memory complexity:
+Uses at most 3times bigger memory than maximal array size (this is only case during reallocation).
+Normal consumption is at most twice as maximal array size.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty array.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns size of array.} \\\hline\hline
+
+\verb!procedure PushBack(value: T)! &  Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts at the end of array (increases size by 1)} \\\hline\hline
+
+\verb!procedure PopBack()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the end of array (decreases size by 1). When array
+is empty, does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when array is empty} \\\hline\hline
+
+\verb!procedure Insert(position: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Inserts value at position. When position is greater than size, puts value
+at the end of array.} \\\hline\hline
+
+\verb!procedure Erase(positine: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Erases element from position. When position is outside of array does
+nothing.} \\\hline\hline
+
+\verb!procedure Clear! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Clears array (set size to zero). But doesn't free memory used by array.}
+\\\hline\hline
+
+\verb!function Front: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns first element from array.} \\\hline\hline
+
+\verb!function Back: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns last element from array.} \\\hline\hline
+
+\verb!procedure Resize(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Changes size of array to num. Doesn't guarantte anything about value of
+newly alocated elements.} \\\hline\hline
+
+\verb!procedure Reserve(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Alocates at least num elements for array. Usefull when you want to
+pushback big number of elements and want to avoid frequent reallocation.} \\\hline\hline
+
+\verb!property item[i: SizeUInt]: T; default;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Property for accessing i-th element in array. Can be used just by square
+brackets (its default property).} \\\hline\hline
+
+\verb!property mutable[i: SizeUInt]: T;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns pointer to i-th element in array. Usefull when you store records.} \\\hline
+
+
+
+\end{longtable}

+ 21 - 0
packages/fcl-stl/doc/vectorexample.pp

@@ -0,0 +1,21 @@
+uses gvector;
+
+type TVectorlli = specialize TVector<longint>;
+
+var Buffer:TVectorlli; i:longint;
+
+begin
+  Buffer := TVectorlli.Create;
+  {Push 5 elements at the end of array}
+  for i:=1 to 5 do
+    Buffer.PushBack(i);
+  {change 3rd element to 47}
+  Buffer[2] := 47;
+  {pop last element}
+  Buffer.PopBack;
+  {print all elements}
+  for i:=0 to Buffer.Size-1 do
+    writeln(Buffer[i]);
+
+  Buffer.Destroy;
+end.

+ 215 - 0
packages/fcl-stl/src/garrayutils.pp

@@ -0,0 +1,215 @@
+{$mode objfpc}
+
+unit garrayutils;
+
+interface
+
+const MaxDepth=60;
+const InsertSortThreshold=16;
+
+{TCompare is comparing class, which should have class method c(a,b:TValue):boolean, which returns true if a is less than b}
+type
+  generic TOrderingArrayUtils<TArr, Tvalue, TCompare>=class
+  private
+    class procedure Sortrange(var Arr:TArr; Start,Fin,d:SizeUInt);
+    class procedure HeapSort(var Arr:TArr; Start,Fin:SizeUInt);
+    class procedure InsertSort(var Arr:TArr; Start,Fin:SizeUInt);
+    class function Left(a:SizeUInt):SizeUInt;inline;
+    class function Right(a:SizeUInt):SizeUInt;inline;
+    class procedure Heapify(var Arr: TArr; Position:SizeUInt; Start,Fin:SizeUInt);
+    class function Parent(a:SizeUInt):SizeUInt;inline;
+  public
+    class procedure Sort(var Arr: TArr; size:SizeUInt);
+  end;
+
+  generic TArrayUtils<TArr, Tvalue>=class
+  public
+    class procedure RandomShuffle(Arr: TArr; size: SizeUInt);
+  end;
+
+implementation
+
+class function TOrderingArrayUtils.Left(a:SizeUInt):SizeUInt;inline;
+begin
+  Left:=((a+1)shl 1)-1;
+end;
+
+class function TOrderingArrayUtils.Right(a:SizeUInt):SizeUInt;inline;
+begin
+  Right:=(a+1) shl 1;
+end;
+
+class function TOrderingArrayUtils.Parent(a:SizeUInt):SizeUInt;inline;
+begin
+  Parent:=(a-1)shr 1;
+end;
+
+class procedure TOrderingArrayUtils.Heapify(var Arr: TArr; Position:SizeUInt; Start,Fin:SizeUInt);
+var mpos,l,r:SizeUInt; temp:TValue;
+begin
+  while(true) do 
+  begin
+    mpos:=Position;
+    l:=Left(Position-Start)+Start;
+    r:=Right(Position-Start)+Start;
+    if (l<Fin) AND (TCompare.c(Arr[mpos],Arr[l])) then
+      mpos:=l;
+    if (r<Fin) AND (TCompare.c(Arr[mpos],Arr[r])) then
+      mpos:=r;
+    if mpos = Position then break;
+    
+    temp:=Arr[Position];
+    Arr[Position]:=Arr[mpos];
+    Arr[mpos]:=temp;
+    Position:=mpos;
+  end;
+end;
+
+class procedure TOrderingArrayUtils.Sort(var Arr:TArr; size:SizeUInt);inline;
+begin
+  Sortrange(Arr,0,size,0);
+  InsertSort(Arr,0,size);
+end;
+
+class procedure TOrderingArrayUtils.Sortrange(var Arr:TArr; Start,Fin,d:SizeUInt);
+var pivot,temp:Tvalue; i,j,k,l:SizeUInt;
+begin
+  if (Fin-Start) <= InsertSortThreshold then
+  begin
+    InsertSort(Arr,Start,Fin);
+    exit;
+  end;
+  if d>=maxdepth then
+  begin
+    HeapSort(Arr, Start, Fin);
+    exit;
+  end;
+{median of 3} 
+  j:=Start;
+  k:=Fin-1;
+  l:=(Start+Fin)div 2;
+  if(TCompare.c(Arr[j],Arr[k])) and (TCompare.c(Arr[j],Arr[l])) then
+  begin
+    if(TCompare.c(Arr[k],Arr[l])) then
+    begin
+      temp:=Arr[k];
+      Arr[k]:=Arr[j];
+      Arr[j]:=temp;
+    end else 
+    begin
+      temp:=Arr[l];
+      Arr[l]:=Arr[j];
+      Arr[j]:=temp;
+    end;
+  end
+  else if(TCompare.c(Arr[k],Arr[j])) and (TCompare.c(Arr[l],Arr[j])) then
+  begin
+    if(TCompare.c(Arr[l],Arr[k])) then
+    begin
+      temp:=Arr[k];
+      Arr[k]:=Arr[j];
+      Arr[j]:=temp;
+    end else
+    begin
+      temp:=Arr[l];
+      Arr[l]:=Arr[j];
+      Arr[j]:=temp;
+    end;
+  end;
+
+{partition} 
+  pivot:=Arr[Start];
+
+  i:=Start-1;
+  j:=Fin;
+  repeat 
+    repeat
+      dec(j);
+    until (not (TCompare.c(pivot,Arr[j])));
+   
+    
+    repeat
+      inc(i);
+    until (not (TCompare.c(Arr[i],pivot)));
+    if(i < j) then
+    begin
+      temp:=Arr[i];
+      Arr[i]:=Arr[j];
+      Arr[j]:=temp;
+    end;
+  until (i>=j);
+
+  Sortrange(Arr, Start, j+1, d+1);
+  Sortrange(Arr, j+1, Fin, d+1);
+end;
+
+class procedure TOrderingArrayUtils.InsertSort(var Arr:TArr; Start,Fin:SizeUInt);inline;
+var i,j:SizeUInt; temp:Tvalue;
+begin
+  for i:=Start+1 to Fin-1 do
+  begin
+    j:=i;
+    temp:=Arr[i];
+    while (j>0) and (TCompare.c(temp,Arr[j-1])) do
+    begin
+      Arr[j]:=Arr[j-1];
+      dec(j);
+    end;
+    Arr[j]:=temp;
+  end;
+end;
+
+class procedure TOrderingArrayUtils.HeapSort(var Arr: TArr; Start,Fin:SizeUInt);
+var i,cur,next,l,r,size:SizeUInt; temp:Tvalue;
+begin
+{buildHeap}
+  size:=Fin-Start;
+  for i:=((size div 2)-1) downto 0 do 
+    Heapify(Arr, i+Start, Start, Fin);
+{bottomup HeapSort}
+  for i:=size-1 downto 1 do
+  begin
+    Fin:=Fin-1;
+    cur:=Start;
+    temp:=Arr[Start];
+    while(true) do
+    begin
+      l:=Left(cur-Start)+Start;
+      if l>=Fin then 
+        break;
+      next:=l;
+      r:=Right(cur-Start)+Start;
+      if (r<Fin) AND (TCompare.c(Arr[l],Arr[r])) then
+        next:=r;
+      Arr[cur]:=Arr[next];
+      cur:=next;
+    end;
+    Arr[cur]:=temp;
+    temp:=Arr[i+Start];
+    Arr[i+Start]:=Arr[cur];
+    Arr[cur]:=temp;
+    l:=Parent(cur-Start)+Start;
+    while (cur <> 0) AND (TCompare.c(Arr[l],Arr[cur])) do
+    begin
+      temp:=Arr[cur];
+      Arr[cur]:=Arr[l];
+      Arr[l]:=temp;
+      cur:=l;
+      l:=Parent(cur-Start)+Start;
+    end;
+  end;
+end;
+
+class procedure TArrayUtils.RandomShuffle(Arr: TArr; size: SizeUInt);
+var i,r:SizeUInt; temp:Tvalue;
+begin
+  for i:=size-1 downto 1 do begin
+    r:=random(Int64(i));
+    temp:=Arr[r];
+    Arr[r]:=Arr[i];
+    Arr[i]:=temp;
+  end;
+end;
+
+
+end.

+ 192 - 0
packages/fcl-stl/src/gdeque.pp

@@ -0,0 +1,192 @@
+{$mode objfpc}
+
+unit gdeque;
+
+interface
+
+type
+  generic TDeque<T>=class
+  private
+  type 
+    PT=^T;
+    TArr=array of T;
+  var 
+    FData:TArr;
+    FDataSize:SizeUInt;
+    FCapacity:SizeUInt;
+    FStart:SizeUInt;
+    procedure SetValue(position:SizeUInt; value:T);inline;
+    function GetValue(position:SizeUInt):T;inline;
+    function GetMutable(position:SizeUInt):PT;inline;
+    procedure IncreaseCapacity();inline;
+  public
+    function Size():SizeUInt;inline;
+    constructor Create();
+    procedure PushBack(value:T);inline;
+    procedure PushFront(value:T);inline;
+    procedure PopBack();inline;
+    procedure PopFront();inline;
+    function Front():T;inline;
+    function Back():T;inline;
+    function IsEmpty():boolean;inline;
+    procedure Reserve(cap:SizeUInt);inline;
+    procedure Resize(cap:SizeUInt);inline;
+    procedure Insert(Position:SizeUInt; Value:T);inline;
+    procedure Erase(Position:SIzeUInt);inline;
+    property Items[i : SizeUInt]: T read GetValue write SetValue; default;
+    property Mutable[i : SizeUInt]:PT read GetMutable;
+end;
+
+implementation
+
+constructor TDeque.Create();
+begin
+  FDataSize:=0;
+  FCapacity:=0;
+  FStart:=0;
+end;
+
+function TDeque.Size():SizeUInt;inline;
+begin
+  Size:=FDataSize;
+end;
+
+function TDeque.IsEmpty():boolean;inline;
+begin
+  if Size()=0 then 
+    IsEmpty:=true
+  else 
+    IsEmpty:=false;
+end;
+
+procedure TDeque.PushBack(value:T);inline;
+begin
+  if(FDataSize=FCapacity) then 
+    IncreaseCapacity;
+  FData[(FStart+FDataSize)mod FCapacity]:=value;
+  inc(FDataSize);
+end;
+
+procedure TDeque.PopFront();inline;
+begin
+  if(FDataSize>0) then 
+  begin
+    inc(FStart);
+    dec(FDataSize);
+    if(FStart=FCapacity) then 
+      FStart:=0;
+  end;
+end;
+
+procedure TDeque.PopBack();inline;
+begin
+  if(FDataSize>0) then
+    dec(FDataSize);
+end;
+
+procedure TDeque.PushFront(value:T);inline;
+begin
+  if(FDataSize=FCapacity) then
+    IncreaseCapacity;
+  if(FStart=0) then
+    FStart:=FCapacity-1
+  else
+    dec(FStart);
+  FData[FStart]:=value;
+  inc(FDataSize);
+end;
+
+function TDeque.Front():T;inline;
+begin
+  Assert(size > 0, 'Accessing empty deque');
+  Front:=FData[FStart];
+end;
+
+function TDeque.Back():T;inline;
+begin
+  Assert(size > 0, 'Accessing empty deque');
+  Back:=FData[(FStart+FDataSize-1)mod FCapacity];
+end;
+
+procedure TDeque.SetValue(position:SizeUInt; value:T);inline;
+begin
+  Assert(position < size, 'Deque access out of range');
+  FData[(FStart+position)mod FCapacity]:=value;
+end;
+
+function TDeque.GetValue(position:SizeUInt):T;inline;
+begin
+  Assert(position < size, 'Deque access out of range');
+  GetValue:=FData[(FStart+position) mod FCapacity];
+end;
+
+function TDeque.GetMutable(position:SizeUInt):PT;inline;
+begin
+  Assert(position < size, 'Deque access out of range');
+  GetMutable:=@FData[(FStart+position) mod FCapacity];
+end;
+
+procedure TDeque.IncreaseCapacity;inline;
+var i,OldEnd:SizeUInt;
+begin
+  OldEnd:=FCapacity;
+  if(FCapacity=0) then
+    FCapacity:=1
+  else
+    FCapacity:=FCapacity*2;
+  SetLength(FData, FCapacity);
+  if (FStart>0) then 
+    for i:=0 to FStart-1 do
+      FData[OldEnd+i]:=FData[i];
+end;
+
+procedure TDeque.Reserve(cap:SizeUInt);inline;
+var i,OldEnd:SizeUInt;
+begin
+  if(cap<FCapacity) then 
+    exit
+  else if(cap<=2*FCapacity) then 
+    IncreaseCapacity
+  else 
+  begin
+    OldEnd:=FCapacity;
+    FCapacity:=cap;
+    SetLength(FData, FCapacity);
+    if FStart > 0 then
+      for i:=0 to FStart-1 do
+        FData[OldEnd+i]:=FData[i];
+  end;
+end;
+
+procedure TDeque.Resize(cap:SizeUInt);inline;
+begin
+  Reserve(cap);
+  FDataSize:=cap;
+end;
+
+procedure TDeque.Insert(Position:SizeUInt; Value: T);inline;
+var i:SizeUInt;
+begin
+  pushBack(Value);
+  for i:=Size-1 downto Position+1 do 
+  begin
+    Items[i]:=Items[i-1];
+  end;
+  Items[Position]:=Value;
+end;
+
+procedure TDeque.Erase(Position:SizeUInt);inline;
+var i:SizeUInt;
+begin
+  if Position <= Size then 
+  begin
+    for i:=Position to Size-2 do
+    begin
+      Items[i]:=Items[i+1];
+    end;
+    popBack();
+  end;
+end;
+
+
+end.

+ 72 - 0
packages/fcl-stl/src/ghashset.pp

@@ -0,0 +1,72 @@
+{$mode objfpc}
+
+{unit ghashset;
+
+interface}
+uses gvector;
+
+const baseSize = 8;
+
+
+
+{Thash should have one class function hash(a:T, n:longint):longint which return uniformly distributed
+value in range <0,n-1> base only on arguments}
+
+type 
+  generic hashset<T, Thash>=class
+    private type TContainer = specialize vector<T>;
+    type TTable = specialize vector<TContainer>;
+    var data:TTable;
+    public constructor create;
+    procedure insert(value:T);inline;
+    function find(value:T):boolean;inline;
+  end;
+
+{implementation}
+
+constructor hashset.create;
+var i:longint;
+begin
+  data:=TTable.create;
+  data.resize(8);
+  for i:=0 to 7 do
+    data[i]:=TContainer.create;
+end;
+
+function hashset.find(value:T):boolean;inline;
+var i,h,bs:longint;
+begin
+  h:=Thash.hash(value,data.size);
+  bs:=data.getValue(h).size;
+  for i:=0 to bs-1 do begin
+    if (data.getvalue(h).getvalue(i)=value) then exit(true);
+  end;
+  exit(false);
+end;
+
+procedure hashset.insert(value:T);inline;
+begin
+  if (find(value)) then exit;
+  (data[Thash.hash(value,data.size)]).pushback(value);
+end;
+
+type hint=class
+  class function hash(a,n:longint):longint;
+end;
+
+class function hint.hash(a,n:longint):longint;
+begin
+  hash:= a mod n;
+end;
+
+type hsli = specialize hashset<longint, hint>;
+
+var data:hsli; i,n:longint;
+
+begin
+  data:=hsli.create;
+  for i:=0 to 10 do
+    data.insert(i);
+  for i:=0 to 13 do
+    writeln(data.find(i));
+end.

+ 151 - 0
packages/fcl-stl/src/gmap.pp

@@ -0,0 +1,151 @@
+{$mode objfpc}
+
+unit gmap;
+
+interface
+
+uses gset;
+
+type
+  generic TMapCompare<TPair, TKeyCompare>=class
+    class function c(a,b :TPair):boolean;
+  end;
+
+  generic TMap<TKey, TValue, TCompare>=class
+  public
+  type
+    TPair=record
+      Key:TKey;
+      Value:TValue;
+    end;
+    TMCompare = specialize TMapCompare<TPair, TCompare>;
+    TMSet = specialize TSet<TPair, TMCompare>;
+    PTValue = ^TValue;
+    PTPair = ^TPair;
+  var
+  private
+    FSet:TMSet;
+  public
+    function Find(key:TKey):TMSet.PNode;inline;
+    function FindLess(key:TKey):TMSet.PNode;inline;
+    function FindLessEqual(key:TKey):TMSet.PNode;inline;
+    function FindGreater(key:TKey):TMSet.PNode;inline;
+    function FindGreaterEqual(key:TKey):TMSet.PNode;inline;
+    function GetValue(key:TKey):TValue;inline;
+    procedure Insert(key:TKey; value:TValue);inline;
+    function Min:TMSet.PNode;inline;
+    function Max:TMSet.PNode;inline;
+    function Next(x:TMSet.PNode):TMSet.PNode;inline;
+    function Prev(x:TMSet.PNode):TMSet.PNode;inline;
+    procedure Delete(key:TKey);inline;
+    function Size:SizeUInt;inline;
+    function IsEmpty:boolean;inline;
+    constructor Create;
+    destructor Destroy;override;
+    property Items[i : TKey]: TValue read GetValue write Insert; default;
+  end;
+
+implementation
+
+class function TMapCompare.c(a,b: TPair):boolean;
+begin
+  c:= TKeyCompare.c(a.Key, b.Key);
+end;
+
+constructor TMap.Create;
+begin
+  FSet:=TMSet.Create;
+end;
+
+destructor TMap.Destroy;
+begin
+  FSet.Destroy;
+end;
+
+procedure TMap.Delete(key:TKey);inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  FSet.Delete(Pair);
+end;
+
+function TMap.Find(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  Find:=FSet.Find(Pair);
+end;
+
+function TMap.FindLess(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  FindLess:=FSet.FindLess(Pair);
+end;
+
+function TMap.FindLessEqual(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  FindLessEqual:=FSet.FindLessEqual(Pair);
+end;
+
+function TMap.FindGreater(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  FindGreater:=FSet.FindGreater(Pair);
+end;
+
+function TMap.FindGreaterEqual(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  FindGreaterEqual:=FSet.FindGreaterEqual(Pair);
+end;
+
+function TMap.GetValue(key:TKey):TValue;inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  GetValue:=FSet.Find(Pair)^.Data.Value;
+end;
+
+procedure TMap.Insert(key:TKey; value:TValue);inline;
+var Pair:TPair;
+begin
+  Pair.Key:=key;
+  FSet.Insert(Pair)^.Data.Value := value;
+end;
+
+function TMap.Min:TMSet.PNode;inline;
+begin
+  Min:=FSet.Min;
+end;
+
+function TMap.Max:TMSet.PNode;inline;
+begin
+  Max:=FSet.Max;
+end;
+
+function TMap.Next(x:TMSet.PNode):TMSet.PNode;inline;
+begin
+  Next:=FSet.Next(x);
+end;
+
+function TMap.Prev(x:TMSet.PNode):TMSet.PNode;inline;
+begin
+  Prev:=FSet.Prev(x);
+end;
+
+function TMap.Size:SizeUInt;inline;
+begin
+  Size:=FSet.Size;
+end;
+
+function TMap.IsEmpty:boolean;inline;
+begin
+  IsEmpty:=FSet.IsEmpty;
+end;
+
+end.

+ 129 - 0
packages/fcl-stl/src/gpriorityqueue.pp

@@ -0,0 +1,129 @@
+{$mode objfpc}
+
+unit gpriorityqueue;
+
+interface 
+
+uses gvector;
+
+{TCompare is comparing class, which should have class method c(a,b:T):boolean, which returns true is a is less than b}
+
+type 
+  generic TPriorityQueue<T, TCompare>=class
+  private
+  type 
+    TContainer=specialize TVector<T>;
+  var
+    FData:TContainer;
+    
+    procedure PushUp(position:SizeUInt);
+    function Left(a:SizeUInt):SizeUInt;inline;
+    function Right(a:SizeUInt):SizeUInt;inline;
+    procedure Heapify(position:SizeUInt);
+    function Parent(a:SizeUInt):SizeUInt;inline;
+  public
+    constructor Create;
+    destructor Destroy;override;
+    function Top:T;inline;
+    procedure Pop;inline;
+    procedure Push(value:T);inline;
+    function Size:SizeUInt;inline;
+    function IsEmpty:boolean;inline;
+  end;
+
+implementation
+
+constructor TPriorityQueue.Create;
+begin
+  FData:=TContainer.Create;
+end;
+
+destructor TPriorityQueue.Destroy;
+begin;
+  FData.Destroy;
+end;
+
+function TPriorityQueue.Size:SizeUInt;inline;
+begin
+  Size:=FData.Size;
+end;
+
+function TPriorityQueue.IsEmpty:boolean;inline;
+begin
+  IsEmpty:=FData.Size=0;
+end;
+
+function TPriorityQueue.Top:T;inline;
+begin
+  Top:=FData[0];
+end;
+
+procedure TPriorityQueue.Pop;inline;
+begin
+  if not IsEmpty then begin
+    FData[0]:=FData.back;
+    FData.PopBack;
+    Heapify(0);
+  end;
+end;
+
+procedure TPriorityQueue.PushUp(position:SizeUInt);
+var np:SizeUInt; temp:T;
+begin
+  while(position>0) do
+  begin
+    np := Parent(position);
+    if(TCompare.c(FData[np],FData[position])) then
+    begin
+      temp:=FData[np];
+      FData[np]:=FData[position];
+      FData[position]:=temp;
+      position:=np;
+    end else
+      break;
+  end;
+end;
+
+procedure TPriorityQueue.Push(value:T);inline;
+begin
+  FData.PushBack(value);
+  PushUp(FData.Size-1);
+end;
+
+function TPriorityQueue.Left(a:SizeUInt):SizeUInt;inline;
+begin
+  Left:=((a+1)shl 1)-1;
+end;
+
+function TPriorityQueue.Right(a:SizeUInt):SizeUInt;inline;
+begin
+  Right:=(a+1) shl 1;
+end;
+
+function TPriorityQueue.Parent(a:SizeUInt):SizeUInt;inline;
+begin
+  Parent:=(a-1)shr 1;
+end;
+
+procedure TPriorityQueue.Heapify(position:SizeUInt);
+var mpos,l,r:SizeUInt; temp:T;
+begin
+  while(true) do
+  begin
+    mpos:=position;
+    l:=Left(position);
+    r:=Right(position);
+    if (l<FData.Size) AND (TCompare.c(FData[mpos],FData[l])) then
+      mpos:=l;
+    if (r<FData.Size) AND (TCompare.c(FData[mpos],FData[r])) then
+      mpos:=r;
+    if mpos = position then break;
+
+    temp:=FData[position];
+    FData[position]:=FData[mpos];
+    FData[mpos]:=temp;
+    position:=mpos;
+  end;
+end;
+
+end.

+ 63 - 0
packages/fcl-stl/src/gqueue.pp

@@ -0,0 +1,63 @@
+{$mode objfpc}
+
+unit gqueue;
+
+interface
+
+uses gdeque;
+
+type 
+  generic TQueue<T>=class
+  private
+  type 
+    TContainer = specialize TDeque<T>;
+  var
+    FData:TContainer;
+  public
+    procedure Push(value:T);inline;
+    procedure Pop();inline;
+    function Front():T;inline;
+    function Size():SizeUInt;inline;
+    function IsEmpty():boolean;inline;
+    constructor Create;
+    destructor Destroy;override;
+end;
+
+implementation
+
+constructor TQueue.Create;
+begin
+  FData:=TContainer.Create;
+end;
+
+destructor TQueue.Destroy;
+begin
+  FData.Destroy;
+end;
+
+procedure TQueue.Push(value:T);inline;
+begin
+  FData.PushBack(value);
+end;
+
+procedure TQueue.Pop();inline;
+begin
+  FData.PopFront;
+end;
+
+function TQueue.Front:T;inline;
+begin
+  Front:=FData.Front;
+end;
+
+function TQueue.Size:SizeUInt;inline;
+begin
+  Size:=FData.Size;
+end;
+
+function TQueue.IsEmpty:boolean;inline;
+begin
+  IsEmpty:=FData.IsEmpty;
+end;
+
+end.

+ 411 - 0
packages/fcl-stl/src/gset.pp

@@ -0,0 +1,411 @@
+{$mode objfpc}
+
+unit gset;
+
+interface
+
+const RED=true;
+const BLACK=false;
+
+type
+  generic TSet<T, TCompare>=class
+  public
+  type 
+    PNode=^Node;
+    Node=record
+      Data:T;
+      Left,Right:PNode;
+      Parent:PNode;
+      Color:boolean;
+    end;
+  var
+  private
+    FBase:PNode;
+    FSize:SizeUInt;
+    
+    function CreateNode(Data:T):PNode;inline;
+    procedure DestroyNodeAndChilds(nod:PNode);
+    procedure DestroyNode(nod:PNode);
+    function RotateRight(nod:PNode):PNode;inline;
+    function RotateLeft(nod:PNode):PNode;inline;
+    procedure FlipColors(nod:PNode);inline;
+    function IsRed(nod:PNode):boolean;inline;
+    function Insert(value:T; nod:PNode; var position:PNode):PNode;
+    function FixUp(nod:PNode):PNode;inline;
+    function MoveRedLeft(nod:PNode):PNode;inline;
+    function MoveRedRight(nod:PNode):PNode;inline;
+    function DeleteMin(nod:PNode):PNode;
+    function Delete(value:T; nod:PNode):PNode;
+    function Min(nod:PNode):PNode;inline;
+    
+  public
+    function Find(value:T):PNode;inline;
+    function FindLess(value:T):PNode;inline;
+    function FindLessEqual(value:T):PNode;inline;
+    function FindGreater(value:T):PNode;inline;
+    function FindGreaterEqual(value:T):PNode;inline;
+    function Insert(value:T):PNode;inline;
+    function Min:PNode;inline;
+    function Max:PNode;inline;
+    function Next(x:PNode):PNode;inline;
+    function Prev(x:PNode):PNode;inline;
+    procedure Delete(value:T);inline;
+    public constructor Create;
+    public destructor Destroy;override;
+    function Size:SizeUInt;
+    function IsEmpty:boolean;
+  end;
+
+implementation
+
+constructor TSet.Create;
+begin
+  FBase:=nil;
+  FSize:=0;
+end;
+
+destructor TSet.Destroy;
+begin
+  DestroyNodeAndChilds(FBase);
+end;
+
+function TSet.Size:SizeUInt;
+begin
+  Size:=FSize;
+end;
+
+function TSet.IsEmpty:boolean;
+begin
+  IsEmpty := FSize=0;
+end;
+
+procedure TSet.DestroyNodeAndChilds(nod:PNode);
+begin
+  if nod = nil then exit;
+  DestroyNodeAndChilds(nod^.left);
+  DestroyNodeAndChilds(nod^.right);
+  DestroyNode(nod);
+end;
+
+procedure TSet.DestroyNode(nod:PNode);
+begin
+  Finalize(nod^.Data);
+  dispose(nod);
+  dec(FSize);
+end;
+
+function TSet.CreateNode(Data:T):PNode;inline;
+var temp:PNode;
+begin
+  temp:=new(PNode);
+  Initialize(temp^.Data);
+  temp^.Data:=Data;
+  temp^.Left:=nil;
+  temp^.Right:=nil;
+  temp^.Parent:=nil;
+  temp^.Color:=RED;
+  inc(FSize);
+  CreateNode:=temp;
+end;
+
+function TSet.RotateRight(nod:PNode):PNode;inline;
+var temp:PNode;
+begin
+  temp:=nod^.Left;
+
+  temp^.Parent:=nod^.Parent;
+  nod^.Parent:=temp;
+
+  nod^.Left:=temp^.Right;
+  temp^.Right:=nod;
+
+  if(nod^.Left<>nil) then nod^.Left^.Parent:=nod;
+
+  temp^.Color:=nod^.Color;
+  nod^.Color:=RED;
+  exit(temp);
+end;
+
+function TSet.RotateLeft(nod:PNode):PNode;inline;
+var temp:PNode;
+begin
+  temp:=nod^.Right;
+
+  temp^.Parent:=nod^.Parent;
+  nod^.Parent:=temp;
+
+  nod^.Right:=temp^.Left;
+  temp^.Left:=nod;
+
+  if(nod^.Right<>nil) then nod^.Right^.Parent:=nod;
+
+  temp^.Color:=nod^.Color;
+  nod^.Color:=RED;
+  exit(temp);
+end;
+
+procedure TSet.FlipColors(nod:PNode);inline;
+begin
+  nod^.Color:= not nod^.Color;
+  nod^.Left^.Color := not nod^.Left^.Color;
+  nod^.Right^.Color := not nod^.Right^.Color;
+end;
+
+
+function TSet.FixUp(nod:PNode):PNode;inline;
+begin
+  if(IsRed(nod^.Right)) and (not IsRed(nod^.Left)) then nod := rotateLeft(nod);
+  if(IsRed(nod^.Left)) and (IsRed(nod^.Left^.Left)) then nod := rotateRight(nod);
+  if(IsRed(nod^.Right)) and (IsRed(nod^.Left)) then flipColors(nod);
+  FixUp:=nod;
+end;
+
+function TSet.MoveRedLeft(nod:PNode):PNode;inline;
+begin
+  flipColors(nod);
+    if (IsRed(nod^.Right^.Left)) then begin 
+          nod^.Right := rotateRight(nod^.Right);
+          nod := rotateLeft(nod);
+          flipColors(nod);
+    end;
+  MoveRedLeft:=nod;
+end;
+
+function TSet.MoveRedRight(nod:PNode):PNode;inline;
+begin
+  flipColors(nod);
+    if (IsRed(nod^.Left^.Left)) then begin 
+          nod := rotateRight(nod);
+          flipColors(nod);
+    end;
+  MoveRedRight:=nod;
+end;
+
+function TSet.DeleteMin(nod:PNode):PNode;
+begin
+  if (nod^.Left = nil) then begin
+    DestroyNode(nod);
+    exit(nil);
+  end;
+
+  if ((not IsRed(nod^.Left)) and (not IsRed(nod^.Left^.Left))) then nod := MoveRedLeft(nod);
+
+  nod^.Left := DeleteMin(nod^.Left);
+
+  exit(FixUp(nod));
+end;
+
+function TSet.Delete(value:T; nod:PNode):PNode;
+begin
+  if (TCompare.c(value, nod^.Data)) then begin
+    if (nod^.Left=nil) then exit(nod);
+    if ((not IsRed(nod^.Left)) and ( not IsRed(nod^.Left^.Left))) then 
+      nod := MoveRedLeft(nod);
+    nod^.Left := Delete(value, nod^.Left);
+  end
+  else begin
+    if (IsRed(nod^.Left)) then begin 
+      nod := rotateRight(nod);
+    end;
+    if ((not TCompare.c(value,nod^.Data)) and (not TCompare.c(nod^.Data,value)) and (nod^.Right = nil)) then 
+    begin
+      DestroyNode(nod);
+      exit(nil);
+    end;
+    if (nod^.Right=nil) then exit(nod);
+    if ((not IsRed(nod^.Right)) and (not IsRed(nod^.Right^.Left))) then nod := MoveRedRight(nod);
+    if ((not TCompare.c(value,nod^.Data)) and (not TCompare.c(nod^.Data,value))) then begin
+      nod^.Data := Min(nod^.Right)^.Data;
+      nod^.Right := DeleteMin(nod^.Right);
+    end
+    else nod^.Right := Delete(value, nod^.Right);
+  end;
+  exit(FixUp(nod));
+end;
+
+procedure TSet.Delete(value:T);inline;
+begin
+  if(FBase<>nil) then FBase:=Delete(value, FBase);
+  if(FBase<>nil) then FBase^.Color:=BLACK;
+end;
+
+
+function TSet.Find(value:T):PNode;inline;
+var x:PNode;
+begin
+  x:=FBase;
+  while(x <> nil) do begin
+    if(TCompare.c(value,x^.Data)) then x:=x^.Left
+    else if(TCompare.c(x^.Data,value)) then x:=x^.Right
+    else exit(x);
+  end;
+  exit(nil);
+end;
+
+function TSet.FindLess(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+  x:=nil;
+  cur:=FBase;
+  while (cur <> nil) do begin
+    if (TCompare.c(cur^.Data, value)) then
+    begin
+      x:=cur;
+      cur:=cur^.right;
+    end else
+      cur:=cur^.left;
+  end;
+  FindLess:=x;
+end;
+
+function TSet.FindLessEqual(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+  x:=nil;
+  cur:=FBase;
+  while (cur <> nil) do begin
+    if (not TCompare.c(value, cur^.data)) then
+    begin
+      x:=cur;
+      cur:=cur^.right;
+    end else
+      cur:=cur^.left;
+  end;
+  FindLessEqual:=x;
+end;
+
+function TSet.FindGreater(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+  x:=nil;
+  cur:=FBase;
+  while (cur <> nil) do begin
+    if (TCompare.c(value, cur^.Data)) then
+    begin
+      x:=cur;
+      cur:=cur^.left;
+    end else
+      cur:=cur^.right;
+  end;
+  FindGreater:=x;
+end;
+
+function TSet.FindGreaterEqual(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+  x:=nil;
+  cur:=FBase;
+  while (cur <> nil) do begin
+    if (not TCompare.c(cur^.Data, value)) then
+    begin
+      x:=cur;
+      cur:=cur^.left;
+    end else
+      cur:=cur^.right;
+  end;
+  FindGreaterEqual:=x;
+end;
+
+function TSet.Insert(value:T):PNode;inline;
+var position:PNode;
+begin
+  FBase:=Insert(value, FBase, position);
+  FBase^.Color:=BLACK;
+  Insert:=position;
+end;
+
+function TSet.Insert(value:T; nod:PNode; var position:PNode):PNode;
+begin
+  if(nod=nil) then begin
+    nod:=CreateNode(value);
+    position:=nod;
+    exit(nod);
+  end;
+  if(TCompare.c(value,nod^.Data)) then begin 
+    nod^.Left:=Insert(value, nod^.Left, position);
+    nod^.Left^.Parent:=nod; 
+  end
+  else if TCompare.c(nod^.Data,value) then begin 
+    nod^.Right:=Insert(value, nod^.Right, position);
+    nod^.Right^.Parent:=nod;
+  end
+  else begin
+    position:=nod;
+    exit(nod);
+  end;
+
+  if(IsRed(nod^.Right)) and (not IsRed(nod^.Left)) then nod := rotateLeft(nod);
+  if(IsRed(nod^.Left)) and (IsRed(nod^.Left^.Left)) then nod := rotateRight(nod);
+  if(IsRed(nod^.Right)) and (IsRed(nod^.Left)) then flipColors(nod);
+  
+  Insert:=nod;
+end;
+
+function TSet.IsRed(nod:PNode):boolean;inline;
+begin
+  if(nod=nil) then exit(false);
+  exit(nod^.Color);
+end;
+
+function TSet.Min(nod:PNode):PNode;inline;
+var temp:PNode;
+begin
+  temp:=nod;
+  while(temp^.Left<>nil) do temp:=temp^.Left;
+  exit(temp);
+end;
+
+function TSet.Min:PNode;inline;
+begin
+  if FBase=nil then exit(nil);
+  Min:=Min(FBase);
+end;
+
+function TSet.Max:PNode;inline;
+var temp:PNode;
+begin
+  if FBase=nil then exit(nil);
+  temp:=FBase;
+  while(temp^.Right<>nil) do temp:=temp^.Right;
+  exit(temp);
+end;
+
+function TSet.Next(x:PNode):PNode;inline;
+var temp:PNode;
+begin
+  if(x=nil) then exit(nil);
+  if(x^.Right<>nil) then begin
+    temp:=x^.Right;
+    while(temp^.Left<>nil) do temp:=temp^.Left;
+  end
+  else begin
+    temp:=x;
+    while(true) do begin
+      if(temp^.Parent=nil) then begin temp:=temp^.Parent; break; end;
+      if(temp^.Parent^.Left=temp) then begin temp:=temp^.Parent; break; end;
+      temp:=temp^.Parent;
+    end;
+  end;
+  exit(temp);
+end;
+
+function TSet.Prev(x:PNode):PNode;inline;
+var temp:PNode;
+begin
+  if(x=nil) then exit(nil);
+  if(x^.Left<>nil) then begin
+    temp:=x^.Left;
+    while(temp^.Right<>nil) do temp:=temp^.Right;
+  end
+  else begin
+    temp:=x;
+    while(true) do begin
+      if(temp^.Parent=nil) then begin temp:=temp^.Parent; break; end;
+      if(temp^.Parent^.Right=temp) then begin temp:=temp^.Parent; break; end;
+      temp:=temp^.Parent;
+    end;
+  end;
+  exit(temp);
+end;
+
+end.

+ 61 - 0
packages/fcl-stl/src/gstack.pp

@@ -0,0 +1,61 @@
+{$mode objfpc}
+
+unit gstack;
+
+interface
+
+uses gvector;
+
+type 
+  generic TStack<T>=class
+    private
+    type TContainer= specialize TVector<T>;
+    var FData:TContainer;
+    public
+    procedure Push(x:T);inline;
+    procedure Pop();inline;
+    function Top():T;inline;
+    function Size():longint;inline;
+    function IsEmpty():boolean;inline;
+    constructor Create;
+    destructor Destroy;override;
+end;
+
+implementation
+
+constructor TStack.Create;
+begin
+  FData:=TContainer.Create;
+end;
+
+destructor TStack.Destroy;
+begin
+  FData.Destroy;
+end;
+
+procedure TStack.Push(x:T);inline;
+begin
+  FData.PushBack(x);
+end;
+
+procedure TStack.Pop;inline;
+begin
+  FData.PopBack;
+end;
+
+function TStack.Top:T;inline;
+begin
+  Top:=FData.Back;
+end;
+
+function TStack.Size:longint;inline;
+begin
+  Size:=FData.Size;
+end;
+
+function TStack.IsEmpty:boolean;inline;
+begin
+  IsEmpty:=FData.IsEmpty;
+end;
+
+end.

+ 27 - 0
packages/fcl-stl/src/gutil.pp

@@ -0,0 +1,27 @@
+{$mode objfpc}
+
+unit gutil;
+
+interface
+
+type generic TLess<T>=class
+  class function c(a,b:T):boolean;inline;
+end;
+
+type generic TGreater<T>=class
+  class function c(a,b:T):boolean;inline;
+end;
+
+implementation
+
+class function TLess.c(a,b:T):boolean;inline;
+begin
+  c:=a<b;
+end;
+
+class function TGreater.c(a,b:T):boolean;inline;
+begin
+  c:=b<a;
+end;
+
+end.

+ 161 - 0
packages/fcl-stl/src/gvector.pp

@@ -0,0 +1,161 @@
+{$mode objfpc}
+
+unit gvector;
+
+interface
+
+type
+  generic TVector<T>=class
+  private
+  type
+    PT=^ T;
+    TArr=array of T;
+  var
+    FCapacity:SizeUInt;
+    FDataSize:SizeUInt;
+    FData:TArr;
+
+    procedure SetValue(Position:SizeUInt; Value:T);inline;
+    function GetValue(Position:SizeUInt):T;inline;
+    function GetMutable(Position:SizeUInt):PT;inline;
+    procedure IncreaseCapacity;inline;
+  public
+    constructor Create;
+    function Size:SizeUInt;inline;
+    procedure PushBack(Value:T);inline;
+    procedure PopBack;inline;
+    function IsEmpty:boolean;inline;
+    procedure Insert(Position:SizeUInt; Value:T);inline;
+    procedure Erase(Position:SizeUInt);inline;
+    procedure Clear;inline;
+    function Front:T;inline;
+    function Back:T;inline;
+    procedure Reserve(Num:SizeUInt);inline;
+    procedure Resize(Num:SizeUInt);inline;
+
+    property Items[i : SizeUInt]: T read getValue write setValue; default;
+    property Mutable[i : SizeUInt]: PT read getMutable;
+end;
+
+implementation
+
+constructor TVector.Create();
+begin
+  FCapacity:=0;
+  FDataSize:=0;
+end;
+
+procedure TVector.SetValue(Position:SizeUInt; Value:T);inline;
+begin
+  Assert(position < size, 'Vector position out of range');
+  FData[Position]:=Value;
+end;
+
+function TVector.GetValue(Position:SizeUInt):T;inline;
+begin
+  Assert(position < size, 'Vector position out of range');
+  GetValue:=FData[Position];
+end;
+
+function TVector.GetMutable(Position:SizeUInt):PT;inline;
+begin
+  Assert(position < size, 'Vector position out of range');
+  GetMutable:=@FData[Position];
+end;
+
+function TVector.Front():T;inline;
+begin
+  Assert(size > 0, 'Accessing element of empty vector');
+  Front:=FData[0];
+end;
+
+function TVector.Back():T;inline;
+begin
+  Assert(size > 0, 'Accessing element of empty vector');
+  Back:=FData[FDataSize-1];
+end;
+
+function TVector.Size():SizeUInt;inline;
+begin
+  Size:=FDataSize;
+end;
+
+function TVector.IsEmpty():boolean;inline;
+begin
+  if Size()=0 then 
+    IsEmpty:=true
+  else 
+    IsEmpty:=false;
+end;
+
+procedure TVector.PushBack(Value:T);inline;
+begin
+  if FDataSize=FCapacity then
+    IncreaseCapacity;
+  FData[FDataSize]:=Value;
+  inc(FDataSize);
+end;
+
+procedure TVector.IncreaseCapacity();inline;
+begin
+  if FCapacity=0 then
+    FCapacity:=1
+  else
+    FCapacity:=FCapacity*2;
+  SetLength(FData, FCapacity);
+end;
+
+procedure TVector.PopBack();inline;
+begin
+  if FDataSize>0 then
+    FDataSize:=FDataSize-1;
+end;
+
+procedure TVector.Insert(Position:SizeUInt; Value: T);inline;
+var i:SizeUInt;
+begin
+  pushBack(Value);
+  for i:=Size-1 downto Position+1 do 
+  begin
+    FData[i]:=FData[i-1];
+  end;
+  FData[Position]:=Value;
+end;
+
+procedure TVector.Erase(Position:SizeUInt);inline;
+var i:SizeUInt;
+begin
+  if Position <= Size then 
+  begin
+    for i:=Position to Size-2 do
+    begin
+      FData[i]:=FData[i+1];
+    end;
+    popBack();
+  end;
+end;
+
+procedure TVector.Clear;inline;
+begin
+  FDataSize:=0;
+end;
+
+procedure TVector.Reserve(Num:SizeUInt);inline;
+begin
+  if(Num < FCapacity) then 
+    exit
+  else if(Num <= 2*FCapacity) then 
+    IncreaseCapacity
+  else begin 
+    SetLength(FData, Num);
+    FCapacity:=Num;
+  end;
+end;
+
+procedure TVector.Resize(Num:SizeUInt);inline;
+begin
+  Reserve(Num);
+  FDataSize:=Num;
+end;
+
+end.

+ 2 - 0
packages/fcl-stl/tests/clean

@@ -0,0 +1,2 @@
+#!/bin/bash
+rm *.o *.ppu ../*.o ../*.ppu

+ 55 - 0
packages/fcl-stl/tests/gdequetest.pp

@@ -0,0 +1,55 @@
+{$mode objfpc}
+
+unit gdequetest;
+
+interface
+
+uses fpcunit, testregistry, gdeque;
+
+type dequelli=specialize TDeque<longint>;
+
+type TGDequeTest = class(TTestCase)
+  Published
+    procedure BackTest;
+    procedure PushTest;
+  public
+    procedure Setup;override;
+  private 
+    data:dequelli;
+  end;
+
+implementation
+
+procedure TGDequeTest.BackTest;
+var i:longint;
+begin
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  for i:=0 to 10 do
+    data.pushback(i);
+  for i:=0 to 10 do begin
+    AssertEquals('Wrong data', 10-i, data.back);
+    AssertEquals('Wrong size', 11-i, data.size);
+    data.popback;
+  end;
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGDequeTest.PushTest;
+var i:longint;
+begin
+  for i:=6 to 10 do
+    data.pushBack(i);
+  for i:=5 downto 0 do
+    data.pushFront(i);
+  for i:=0 to 10 do
+    AssertEquals('Wrong data', i, data[i]);
+end;
+
+procedure TGDequeTest.Setup;
+begin
+  data:=dequelli.create;
+end;
+
+initialization
+  RegisterTest(TGDequeTest);
+end.

+ 84 - 0
packages/fcl-stl/tests/gmaptest.pp

@@ -0,0 +1,84 @@
+{$mode objfpc}
+
+unit gmaptest;
+
+interface
+
+uses fpcunit, testregistry, gmap, gutil;
+
+type lesslli=specialize TLess<longint>;
+     maplli=specialize TMap<longint,longint, lesslli>;
+
+type TGMapTest = class(TTestCase)
+  Published
+    procedure MapTest;
+  public
+    procedure Setup;override;
+  private 
+    data:maplli;
+  end;
+
+implementation
+
+procedure TGMapTest.MapTest;
+var it:maplli.TMSet.pnode;
+begin
+  data[3]:=3;
+  data[5]:=5;
+  data[7]:=7;
+  AssertEquals('Wrong min key', 3, data.min()^.data.key);
+  AssertEquals('Wrong max key', 7, data.max()^.data.key);
+  AssertEquals('Wrong min val', 3, data.min()^.data.value);
+  AssertEquals('Wrong max val', 7, data.max()^.data.value);
+
+  AssertEquals('Wrong val', 5, data[5]);
+
+  data.delete(3);
+  AssertEquals('Wrong min key', 5, data.min()^.data.key);
+  AssertEquals('Wrong max key', 7, data.max()^.data.key);
+  AssertEquals('Wrong min val', 5, data.min()^.data.value);
+  AssertEquals('Wrong max val', 7, data.max()^.data.value);
+
+
+  data[3]:=3;
+  data[3]:=47;
+  AssertEquals('Wrong val 2', 47, data[3]);
+
+  if(data.find(4)<>nil) then 
+    AssertEquals('Found key which not there', 0, 1);
+
+  data[17]:=42;
+
+  it:=data.min;
+  AssertEquals('Wrong min', 3, it^.Data.key);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 5, it^.Data.key);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 7, it^.Data.key);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 17, it^.Data.key);
+  it:=data.next(it);
+  if(it<>nil) then
+    AssertEquals('Last not nil', 0, 1);
+
+  it:=data.max;
+  AssertEquals('Wrong max', 17, it^.Data.key);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 7, it^.Data.key);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 5, it^.Data.key);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 3, it^.Data.key);
+  it:=data.prev(it);
+  if(it<>nil) then
+    AssertEquals('First not nil', 0, 1);
+end;
+
+procedure TGMapTest.Setup;
+begin
+  data:=maplli.create;
+end;
+
+initialization
+  RegisterTest(TGMapTest);
+end.

+ 84 - 0
packages/fcl-stl/tests/gmaptestzal.pp

@@ -0,0 +1,84 @@
+{$mode objfpc}
+
+unit gmaptest;
+
+interface
+
+uses fpcunit, testregistry, gmap, gutil;
+
+type lesslli=specialize TLess<longint>;
+     maplli=specialize TMap<longint,longint, lesslli>;
+
+type TGMapTest = class(TTestCase)
+  Published
+    procedure MapTest;
+  public
+    procedure Setup;override;
+  private 
+    data:maplli;
+  end;
+
+implementation
+
+procedure TGMapTest.MapTest;
+var it:maplli.TMSet.pnode;
+begin
+  data[3]:=3;
+  data[5]:=5;
+  data[7]:=7;
+  AssertEquals('Wrong min key', 3, data.min()^.key);
+  AssertEquals('Wrong max key', 7, data.max()^.key);
+  AssertEquals('Wrong min val', 3, data.min()^.value);
+  AssertEquals('Wrong max val', 7, data.max()^.value);
+
+  AssertEquals('Wrong val', 5, data[5]);
+
+  data.delete(3);
+  AssertEquals('Wrong min key', 5, data.min()^.key);
+  AssertEquals('Wrong max key', 7, data.max()^.key);
+  AssertEquals('Wrong min val', 5, data.min()^.value);
+  AssertEquals('Wrong max val', 7, data.max()^.value);
+
+
+  data[3]:=3;
+  data[3]:=47;
+  AssertEquals('Wrong val 2', 47, data[3]);
+
+  if(data.find(4)<>nil) then 
+    AssertEquals('Found key which not there', 0, 1);
+
+  data[17]:=42;
+
+  it:=data.min;
+  AssertEquals('Wrong min', 3, it^.key);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 5, it^.key);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 7, it^.key);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 17, it^.key);
+  it:=data.next(it);
+  if(it<>nil) then
+    AssertEquals('Last not nil', 0, 1);
+
+  it:=data.max;
+  AssertEquals('Wrong max', 17, it^.key);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 7, it^.key);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 5, it^.key);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 3, it^.key);
+  it:=data.prev(it);
+  if(it<>nil) then
+    AssertEquals('First not nil', 0, 1);
+end;
+
+procedure TGMapTest.Setup;
+begin
+  data:=maplli.create;
+end;
+
+initialization
+  RegisterTest(TGMapTest);
+end.

+ 47 - 0
packages/fcl-stl/tests/gpriorityqueuetest.pp

@@ -0,0 +1,47 @@
+{$mode objfpc}
+
+unit gpriorityqueuetest;
+
+interface
+
+uses fpcunit, testregistry, gpriorityqueue, gutil;
+
+type lesslli=specialize TLess<longint>;
+     queuelli=specialize TPriorityQueue<longint,lesslli>;
+
+type TGPQueueTest = class(TTestCase)
+  Published
+    procedure QueueTest;
+  public
+    procedure Setup;override;
+  private 
+    data:queuelli;
+  end;
+
+implementation
+
+procedure TGPQueueTest.QueueTest;
+var i,last:longint;
+begin
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  for i:=0 to 10 do
+    data.push(random(10000));
+  last:=data.top;
+  data.pop;
+  for i:=0 to 9 do begin
+    AssertEquals('Wrong order', true, data.top<last);
+    AssertEquals('Wrong size', 10-i, data.size);
+    last:=data.top;
+    data.pop;
+  end;
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGPQueueTest.Setup;
+begin
+  data:=queuelli.create;
+end;
+
+initialization
+  RegisterTest(TGPQueueTest);
+end.

+ 43 - 0
packages/fcl-stl/tests/gqueuetest.pp

@@ -0,0 +1,43 @@
+{$mode objfpc}
+
+unit gqueuetest;
+
+interface
+
+uses fpcunit, testregistry, gqueue;
+
+type TQueuelli=specialize TQueue<longint>;
+
+type TGTQueueTest = class(TTestCase)
+  Published
+    procedure TQueueTest;
+  public
+    procedure Setup;override;
+  private 
+    data:TQueuelli;
+  end;
+
+implementation
+
+procedure TGTQueueTest.TQueueTest;
+var i:longint;
+begin
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  for i:=0 to 10 do
+    data.push(i);
+  for i:=0 to 10 do begin
+    AssertEquals('Wrong data', i, data.front);
+    AssertEquals('Wrong size', 11-i, data.size);
+    data.pop;
+  end;
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGTQueueTest.Setup;
+begin
+  data:=TQueuelli.create;
+end;
+
+initialization
+  RegisterTest(TGTQueueTest);
+end.

+ 59 - 0
packages/fcl-stl/tests/gsetrefcounttest.pp

@@ -0,0 +1,59 @@
+{$mode objfpc}
+
+unit gsetrefcounttest;
+
+interface
+
+uses fpcunit, testregistry, gset, gutil;
+
+type 
+  arr = class
+    a:longint;
+  end;
+  lll=class
+    class function c(a,b: arr):boolean;
+  end;
+
+type setlli=specialize RBSet<arr,lll>;
+
+type TGSetRefCountTest = class(TTestCase)
+  Published
+    procedure SetTest;
+  public
+    procedure Setup;override;
+  private 
+    data:setlli;
+  end;
+
+implementation
+
+class function lll.c(a,b: arr):boolean;
+begin
+  c:=a.a<b.a;
+end;
+
+procedure TGSetRefCountTest.SetTest;
+var x:arr; i:longint;
+    it:setlli.pnode;
+begin
+  for i:=0 to 20000 do begin
+    x:=arr.create;
+    x.a:=i;
+    {code should crash on this insert}
+    data.insert(x);
+  end;
+  it:=data.min;
+  while it<>nil do begin
+    writeln(it^.data.a);
+    it:=data.next(it);
+  end;
+end;
+
+procedure TGSetRefCountTest.Setup;
+begin
+  data:=setlli.create;
+end;
+
+initialization
+  RegisterTest(TGSetRefCountTest);
+end.

+ 110 - 0
packages/fcl-stl/tests/gsettest.pp

@@ -0,0 +1,110 @@
+{$mode objfpc}
+
+unit gsettest;
+
+interface
+
+uses fpcunit, testregistry, gset, gutil;
+
+type lesslli=specialize TLess<longint>;
+     setlli=specialize TSet<longint,lesslli>;
+
+type TGSetTest = class(TTestCase)
+  Published
+    procedure SetTest;
+  public
+    procedure Setup;override;
+  private 
+    data:setlli;
+  end;
+
+implementation
+
+procedure TGSetTest.SetTest;
+var it:setlli.pnode;
+begin
+  data.insert(3);
+  data.insert(5);
+  data.insert(7);
+  AssertEquals('Wrong min', 3, data.min()^.data);
+  AssertEquals('Wrong max', 7, data.max()^.data);
+  data.delete(3);
+  AssertEquals('Wrong size', 2, data.size);
+  AssertEquals('Wrong min', 5, data.min()^.data);
+  data.insert(3);
+  data.insert(3);
+  data.insert(3);
+  AssertEquals('Wrong size', 3, data.size);
+  AssertEquals('Wrong min', 3, data.min()^.data);
+  if(data.find(4)<>nil) then 
+    Fail('Found key which not there');
+  if(data.find(5)=nil) then
+    Fail('Not found key which was there');
+
+  if(data.FindLess(8)^.data<>7) then
+    Fail('Wrong less than 8');
+  if(data.FindLess(7)^.data<>5) then
+    Fail('Wrong less than 7');
+  if(data.FindLess(3)<>nil) then
+    Fail('Wrong less than 3');
+
+  if(data.FindLessEqual(8)^.data<>7) then
+    Fail('Wrong less equal than 8');
+  if(data.FindLessEqual(7)^.data<>7) then
+    Fail('Wrong less equal than 7');
+  if(data.FindLessEqual(6)^.data<>5) then
+    Fail('Wrong less equal than 6');
+  if(data.FindLessEqual(2)<>nil) then
+    Fail('Wrong less equal than 2');
+
+  if(data.FindGreater(2)^.data<>3) then
+    Fail('Wrong greater than 2');
+  if(data.Findgreater(3)^.data<>5) then
+    Fail('Wrong greater than 3');
+  if(data.Findgreater(7)<>nil) then
+    Fail('Wrong greater than 7');
+
+  if(data.FindGreaterEqual(2)^.data<>3) then
+    Fail('Wrong greater equal than 2');
+  if(data.FindGreaterEqual(3)^.data<>3) then
+    Fail('Wrong greater equal than 3');
+  if(data.FindGreaterEqual(4)^.data<>5) then
+    Fail('Wrong greater equal than 4');
+  if(data.FindGreaterEqual(8)<>nil) then
+    Fail('Wrong greater equal than 8');
+
+  data.insert(17);
+
+  it:=data.min;
+  AssertEquals('Wrong min', 3, it^.data);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 5, it^.data);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 7, it^.data);
+  it:=data.next(it);
+  AssertEquals('Wrong next', 17, it^.data);
+  it:=data.next(it);
+  if(it<>nil) then
+    AssertEquals('Last not nil', 0, 1);
+
+  it:=data.max;
+  AssertEquals('Wrong max', 17, it^.data);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 7, it^.data);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 5, it^.data);
+  it:=data.prev(it);
+  AssertEquals('Wrong prev', 3, it^.data);
+  it:=data.prev(it);
+  if(it<>nil) then
+    AssertEquals('First not nil', 0, 1);
+end;
+
+procedure TGSetTest.Setup;
+begin
+  data:=setlli.create;
+end;
+
+initialization
+  RegisterTest(TGSetTest);
+end.

+ 52 - 0
packages/fcl-stl/tests/gsorttest.pp

@@ -0,0 +1,52 @@
+{$mode objfpc}
+
+unit gsorttest;
+
+interface
+
+uses fpcunit, testregistry, gvector, garrayutils, gutil;
+
+type vectorlli=specialize TVector<longint>;
+     lesslli=specialize TLess<longint>;
+     sortlli=specialize TOrderingArrayUtils<vectorlli, longint, lesslli>;
+
+type TGSortTest = class(TTestCase)
+  Published
+    procedure SortRandomTest;
+    procedure SortZeroOneTest;
+  public
+    procedure Setup;override;
+  private 
+    data:vectorlli;
+  end;
+
+implementation
+
+procedure TGSortTest.SortRandomTest;
+var i:longint;
+begin
+  for i:=0 to 5000 do
+    data.pushBack(random(10000));
+  sortlli.sort(data, 5001);
+  for i:=0 to 4999 do
+    AssertEquals('Wrong order', false, data[i+1]<data[i]);
+end;
+
+procedure TGSortTest.SortZeroOneTest;
+var i:longint;
+begin
+  for i:=0 to 5000 do
+    data.pushBack(random(2));
+  sortlli.sort(data, 5001);
+  for i:=0 to 4999 do
+    AssertEquals('Wrong order', false, data[i+1]<data[i]);
+end;
+
+procedure TGSortTest.Setup;
+begin
+  data:=vectorlli.create;
+end;
+
+initialization
+  RegisterTest(TGSortTest);
+end.

+ 43 - 0
packages/fcl-stl/tests/gstacktest.pp

@@ -0,0 +1,43 @@
+{$mode objfpc}
+
+unit gstacktest;
+
+interface
+
+uses fpcunit, testregistry, gstack;
+
+type TStacklli=specialize TStack<longint>;
+
+type TGTStackTest = class(TTestCase)
+  Published
+    procedure TStackTest;
+  public
+    procedure Setup;override;
+  private 
+    data:TStacklli;
+  end;
+
+implementation
+
+procedure TGTStackTest.TStackTest;
+var i:longint;
+begin
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  for i:=0 to 10 do
+    data.push(i);
+  for i:=0 to 10 do begin
+    AssertEquals('Wrong data', 10-i, data.top);
+    AssertEquals('Wrong size', 11-i, data.size);
+    data.pop;
+  end;
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGTStackTest.Setup;
+begin
+  data:=TStacklli.create;
+end;
+
+initialization
+  RegisterTest(TGTStackTest);
+end.

+ 111 - 0
packages/fcl-stl/tests/gvectortest.pp

@@ -0,0 +1,111 @@
+{$mode objfpc}
+
+unit gvectortest;
+
+interface
+
+uses fpcunit, testregistry, gvector;
+
+type vectorlli=specialize TVector<longint>;
+     rec=record
+      a,b:longint;
+     end;
+     vectorrec=specialize TVector<rec>;
+
+type TGVectorTest = class(TTestCase)
+  Published
+    procedure PushBackTest;
+    procedure ResizeTest;
+    procedure PopbackTest;
+    procedure InsertEraseTest;
+    procedure MutableTest;
+  public
+    procedure Setup;override;
+  private 
+    data:vectorlli;
+  end;
+
+implementation
+
+procedure TGVectorTest.PushBackTest;
+var i:longint;
+begin
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  for i:=0 to 10 do
+    data.pushBack(i);
+  for i:=0 to 10 do
+    AssertEquals('Wrong data', i, data[i]);
+  
+  AssertEquals('Wrong size', 11, data.size);
+  AssertEquals('IsEmpty', false, data.IsEmpty);
+end;
+
+procedure TGVectorTest.ResizeTest;
+var i:longint;
+begin
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  data.resize(50);
+  AssertEquals('IsEmpty', false, data.IsEmpty);
+  for i:=0 to 49 do 
+    data[i]:=3*i;
+  for i:=0 to 49 do
+    AssertEquals('Wrong data', 3*i, data[i]);
+  AssertEquals('Wrong size', 50, data.size);
+end;
+
+procedure TGVectorTest.PopbackTest;
+var i:longint;
+begin
+  for i:=0 to 49 do begin
+    data.pushBack(5*i);
+    AssertEquals('Wrong end', 5*i, data.back);
+    AssertEquals('Wrong front', 0, data.front);
+  end;
+  for i:=1 to 10 do begin
+    data.popBack;
+    AssertEquals('Wrong end after popback', 5*(49-i), data.back);
+  end;
+end;
+
+procedure TGVectorTest.InsertEraseTest;
+var i:longint;
+begin
+  for i:=0 to 9 do
+    data.pushBack(i);
+  data.insert(3,100);
+  for i:=0 to 2 do
+    AssertEquals('Wrong data before insert', i, data[i]);
+  AssertEquals('Wrong data', 100, data[3]);
+  for i:=4 to 10 do
+    AssertEquals('Wrong data after insert', i-1, data[i]);
+  data.erase(4);
+  for i:=4 to 9 do
+    AssertEquals('Wrong data after erase', i, data[i]);
+  AssertEquals('Wrong data before erase', 100, data[3]);
+  for i:=0 to 2 do
+    AssertEquals('Wrong data before erase', i, data[i]);
+end;
+
+procedure TGVectorTest.MutableTest;
+var dat:vectorrec;
+begin
+  dat:=vectorrec.create;
+  dat.resize(2);
+  dat.mutable[0]^.a:=5;
+  dat.mutable[0]^.b:=7;
+  AssertEquals('Wrong data', 5, dat[0].a);
+  AssertEquals('Wrong data', 7, dat[0].b);
+  dat.mutable[0]^.a:=45;
+  dat.mutable[0]^.b:=47;
+  AssertEquals('Wrong data', 45, dat[0].a);
+  AssertEquals('Wrong data', 47, dat[0].b);
+end;
+
+procedure TGVectorTest.Setup;
+begin
+  data:=vectorlli.create;
+end;
+
+initialization
+  RegisterTest(TGVectorTest);
+end.

+ 4 - 0
packages/fcl-stl/tests/run-all-tests

@@ -0,0 +1,4 @@
+#!/bin/bash
+rm *.o *.ppu ../*.o ../*.ppu testrunner
+fpc -Fu.. -gttt testrunner.pp -Sa
+./testrunner --all

+ 27 - 0
packages/fcl-stl/tests/suiteconfig.pp

@@ -0,0 +1,27 @@
+{$mode objfpc}
+{$h+}
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+
+    a unit to register the tests to be runned.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit suiteconfig;
+
+interface
+
+uses
+  gvectortest, gstacktest, gqueuetest, gdequetest, gsorttest,
+  gpriorityqueuetest, gsettest, gmaptest;
+
+implementation
+
+end.

+ 138 - 0
packages/fcl-stl/tests/testrunner.pp

@@ -0,0 +1,138 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+
+    an example of a console test runner of FPCUnit tests.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+program testrunner;
+
+{$mode objfpc}
+{$h+}
+
+uses
+  custapp, Classes, SysUtils, fpcunit, suiteconfig, testreport, testregistry;
+
+
+const
+  ShortOpts = 'alh';
+  Longopts: Array[1..5] of String = (
+    'all','list','format:','suite:','help');
+  Version = 'Version 0.2';
+
+
+type
+  TTestRunner = Class(TCustomApplication)
+  private
+    FXMLResultsWriter: TXMLResultsWriter;
+  protected
+    procedure   DoRun ; Override;
+    procedure   doTestRun(aTest: TTest); virtual;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor  Destroy; override;
+  end;
+
+
+constructor TTestRunner.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FXMLResultsWriter := TXMLResultsWriter.Create;
+end;
+
+
+destructor TTestRunner.Destroy;
+begin
+  FXMLResultsWriter.Free;
+end;
+
+
+procedure TTestRunner.doTestRun(aTest: TTest);
+var
+  testResult: TTestResult;
+begin
+  testResult := TTestResult.Create;
+  try
+    testResult.AddListener(FXMLResultsWriter);
+    aTest.Run(testResult);
+    FXMLResultsWriter.WriteResult(testResult);
+  finally
+    testResult.Free;
+  end;
+end;
+
+
+procedure TTestRunner.DoRun;
+var
+  I : Integer;
+  S : String;
+begin
+  S:=CheckOptions(ShortOpts,LongOpts);
+  If (S<>'') then
+    Writeln(S);
+  if HasOption('h', 'help') or (ParamCount = 0) then
+  begin
+    writeln(Title);
+    writeln(Version);
+    writeln('Usage: ');
+    writeln('-l or --list to show a list of registered tests');
+    writeln('default format is xml, add --format=latex to output the list as latex source');
+    writeln('-a or --all to run all the tests and show the results in xml format');
+    writeln('The results can be redirected to an xml file,');
+    writeln('for example: ./testrunner --all > results.xml');
+    writeln('use --suite=MyTestSuiteName to run only the tests in a single test suite class');
+  end
+  else;
+    if HasOption('l', 'list') then
+    begin
+      if HasOption('format') then
+      begin
+        if GetOptionValue('format') = 'latex' then
+          writeln(GetSuiteAsLatex(GetTestRegistry))
+        else
+          writeln(GetSuiteAsXML(GetTestRegistry));
+      end
+      else
+        writeln(GetSuiteAsXML(GetTestRegistry));
+    end;
+  if HasOption('a', 'all') then
+  begin
+    doTestRun(GetTestRegistry)
+  end
+  else
+    if HasOption('suite') then
+    begin
+      S := '';
+      S:=GetOptionValue('suite');
+      if S = '' then
+        for I := 0 to GetTestRegistry.Tests.count - 1 do
+          writeln(GetTestRegistry[i].TestName)
+      else
+      for I := 0 to GetTestRegistry.Tests.count - 1 do
+        if GetTestRegistry[i].TestName = S then
+        begin
+          doTestRun(GetTestRegistry[i]);
+        end;
+    end;
+  Terminate;
+end;
+
+
+var
+  App: TTestRunner;
+
+
+begin
+  App := TTestRunner.Create(nil);
+  App.Initialize;
+  App.Title := 'FPCUnit Console Test Case runner.';
+  App.Run;
+  App.Free;
+end.
+