summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-04-03 09:15:56 +0000
committermichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-04-03 09:15:56 +0000
commitd701d26e700344378958eb27c45723d9aa6da224 (patch)
tree9d28d8a8514e70cb4a4f47ec54375a65b3606dd0
parent14762c7885de0eabafe72c9c035e44ae9b364133 (diff)
downloadfpc-d701d26e700344378958eb27c45723d9aa6da224.tar.gz
* Initial check-in of stl
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@17233 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--packages/fcl-stl/Makefile2427
-rw-r--r--packages/fcl-stl/Makefile.fpc23
-rw-r--r--packages/fcl-stl/doc/arrayutils.tex47
-rw-r--r--packages/fcl-stl/doc/deque.tex81
-rw-r--r--packages/fcl-stl/doc/dequeexample.pp24
-rw-r--r--packages/fcl-stl/doc/main.tex63
-rw-r--r--packages/fcl-stl/doc/makra.tex263
-rw-r--r--packages/fcl-stl/doc/map.tex87
-rw-r--r--packages/fcl-stl/doc/mapexample.pp24
-rw-r--r--packages/fcl-stl/doc/priorityqueue.tex44
-rw-r--r--packages/fcl-stl/doc/priorityqueueexample.pp30
-rw-r--r--packages/fcl-stl/doc/queue.tex39
-rw-r--r--packages/fcl-stl/doc/queueexample.pp17
-rw-r--r--packages/fcl-stl/doc/set.tex76
-rw-r--r--packages/fcl-stl/doc/setexample.pp24
-rw-r--r--packages/fcl-stl/doc/sortingexample.pp20
-rw-r--r--packages/fcl-stl/doc/stack.tex39
-rw-r--r--packages/fcl-stl/doc/stackexample.pp17
-rw-r--r--packages/fcl-stl/doc/util.tex9
-rw-r--r--packages/fcl-stl/doc/vector.tex73
-rw-r--r--packages/fcl-stl/doc/vectorexample.pp21
-rw-r--r--packages/fcl-stl/src/garrayutils.pp215
-rw-r--r--packages/fcl-stl/src/gdeque.pp192
-rw-r--r--packages/fcl-stl/src/ghashset.pp72
-rw-r--r--packages/fcl-stl/src/gmap.pp151
-rw-r--r--packages/fcl-stl/src/gpriorityqueue.pp129
-rw-r--r--packages/fcl-stl/src/gqueue.pp63
-rw-r--r--packages/fcl-stl/src/gset.pp411
-rw-r--r--packages/fcl-stl/src/gstack.pp61
-rw-r--r--packages/fcl-stl/src/gutil.pp27
-rw-r--r--packages/fcl-stl/src/gvector.pp161
-rwxr-xr-xpackages/fcl-stl/tests/clean2
-rw-r--r--packages/fcl-stl/tests/gdequetest.pp55
-rw-r--r--packages/fcl-stl/tests/gmaptest.pp84
-rw-r--r--packages/fcl-stl/tests/gmaptestzal.pp84
-rw-r--r--packages/fcl-stl/tests/gpriorityqueuetest.pp47
-rw-r--r--packages/fcl-stl/tests/gqueuetest.pp43
-rw-r--r--packages/fcl-stl/tests/gsetrefcounttest.pp59
-rw-r--r--packages/fcl-stl/tests/gsettest.pp110
-rw-r--r--packages/fcl-stl/tests/gsorttest.pp52
-rw-r--r--packages/fcl-stl/tests/gstacktest.pp43
-rw-r--r--packages/fcl-stl/tests/gvectortest.pp111
-rwxr-xr-xpackages/fcl-stl/tests/run-all-tests4
-rw-r--r--packages/fcl-stl/tests/suiteconfig.pp27
-rw-r--r--packages/fcl-stl/tests/testrunner.pp138
45 files changed, 5789 insertions, 0 deletions
diff --git a/packages/fcl-stl/Makefile b/packages/fcl-stl/Makefile
new file mode 100644
index 0000000000..c94d564fd7
--- /dev/null
+++ b/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:
diff --git a/packages/fcl-stl/Makefile.fpc b/packages/fcl-stl/Makefile.fpc
new file mode 100644
index 0000000000..59ec0f3c9d
--- /dev/null
+++ b/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:
diff --git a/packages/fcl-stl/doc/arrayutils.tex b/packages/fcl-stl/doc/arrayutils.tex
new file mode 100644
index 0000000000..b53f8bbf4c
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/deque.tex b/packages/fcl-stl/doc/deque.tex
new file mode 100644
index 0000000000..d3b85045bd
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/dequeexample.pp b/packages/fcl-stl/doc/dequeexample.pp
new file mode 100644
index 0000000000..f24a54111a
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/main.tex b/packages/fcl-stl/doc/main.tex
new file mode 100644
index 0000000000..454306a4ee
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/makra.tex b/packages/fcl-stl/doc/makra.tex
new file mode 100644
index 0000000000..c1e3419d7d
--- /dev/null
+++ b/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
+%% }}}
diff --git a/packages/fcl-stl/doc/map.tex b/packages/fcl-stl/doc/map.tex
new file mode 100644
index 0000000000..72edbb0e3d
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/mapexample.pp b/packages/fcl-stl/doc/mapexample.pp
new file mode 100644
index 0000000000..679c73b03f
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/priorityqueue.tex b/packages/fcl-stl/doc/priorityqueue.tex
new file mode 100644
index 0000000000..192010c030
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/priorityqueueexample.pp b/packages/fcl-stl/doc/priorityqueueexample.pp
new file mode 100644
index 0000000000..32756bc2d4
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/queue.tex b/packages/fcl-stl/doc/queue.tex
new file mode 100644
index 0000000000..0105a6c1b3
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/queueexample.pp b/packages/fcl-stl/doc/queueexample.pp
new file mode 100644
index 0000000000..1206c9f660
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/set.tex b/packages/fcl-stl/doc/set.tex
new file mode 100644
index 0000000000..2e7259a118
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/setexample.pp b/packages/fcl-stl/doc/setexample.pp
new file mode 100644
index 0000000000..758b1a5245
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/sortingexample.pp b/packages/fcl-stl/doc/sortingexample.pp
new file mode 100644
index 0000000000..4aa155909d
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/stack.tex b/packages/fcl-stl/doc/stack.tex
new file mode 100644
index 0000000000..64d11f594c
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/stackexample.pp b/packages/fcl-stl/doc/stackexample.pp
new file mode 100644
index 0000000000..31d3bb57e0
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/doc/util.tex b/packages/fcl-stl/doc/util.tex
new file mode 100644
index 0000000000..7a02f8ac0a
--- /dev/null
+++ b/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}
+
diff --git a/packages/fcl-stl/doc/vector.tex b/packages/fcl-stl/doc/vector.tex
new file mode 100644
index 0000000000..c0097262d3
--- /dev/null
+++ b/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}
diff --git a/packages/fcl-stl/doc/vectorexample.pp b/packages/fcl-stl/doc/vectorexample.pp
new file mode 100644
index 0000000000..5b0e4eba0f
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/garrayutils.pp b/packages/fcl-stl/src/garrayutils.pp
new file mode 100644
index 0000000000..2f5f9d66a9
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gdeque.pp b/packages/fcl-stl/src/gdeque.pp
new file mode 100644
index 0000000000..d6f06e3696
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/ghashset.pp b/packages/fcl-stl/src/ghashset.pp
new file mode 100644
index 0000000000..ad45dce165
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gmap.pp b/packages/fcl-stl/src/gmap.pp
new file mode 100644
index 0000000000..7234433435
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gpriorityqueue.pp b/packages/fcl-stl/src/gpriorityqueue.pp
new file mode 100644
index 0000000000..3946dd718a
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gqueue.pp b/packages/fcl-stl/src/gqueue.pp
new file mode 100644
index 0000000000..e638c7c110
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gset.pp b/packages/fcl-stl/src/gset.pp
new file mode 100644
index 0000000000..425fb55cfd
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gstack.pp b/packages/fcl-stl/src/gstack.pp
new file mode 100644
index 0000000000..91567c6fe6
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gutil.pp b/packages/fcl-stl/src/gutil.pp
new file mode 100644
index 0000000000..d1a44b1901
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/src/gvector.pp b/packages/fcl-stl/src/gvector.pp
new file mode 100644
index 0000000000..c1fbc27d96
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/clean b/packages/fcl-stl/tests/clean
new file mode 100755
index 0000000000..e58cd16dae
--- /dev/null
+++ b/packages/fcl-stl/tests/clean
@@ -0,0 +1,2 @@
+#!/bin/bash
+rm *.o *.ppu ../*.o ../*.ppu
diff --git a/packages/fcl-stl/tests/gdequetest.pp b/packages/fcl-stl/tests/gdequetest.pp
new file mode 100644
index 0000000000..9dfb8a0e9a
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gmaptest.pp b/packages/fcl-stl/tests/gmaptest.pp
new file mode 100644
index 0000000000..6d5325b26f
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gmaptestzal.pp b/packages/fcl-stl/tests/gmaptestzal.pp
new file mode 100644
index 0000000000..ce8b05b860
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gpriorityqueuetest.pp b/packages/fcl-stl/tests/gpriorityqueuetest.pp
new file mode 100644
index 0000000000..9d55c6959a
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gqueuetest.pp b/packages/fcl-stl/tests/gqueuetest.pp
new file mode 100644
index 0000000000..ca4a2a16e4
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gsetrefcounttest.pp b/packages/fcl-stl/tests/gsetrefcounttest.pp
new file mode 100644
index 0000000000..c381367fc1
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gsettest.pp b/packages/fcl-stl/tests/gsettest.pp
new file mode 100644
index 0000000000..e828236e90
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gsorttest.pp b/packages/fcl-stl/tests/gsorttest.pp
new file mode 100644
index 0000000000..a51e8ee493
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gstacktest.pp b/packages/fcl-stl/tests/gstacktest.pp
new file mode 100644
index 0000000000..397a2b5292
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/gvectortest.pp b/packages/fcl-stl/tests/gvectortest.pp
new file mode 100644
index 0000000000..660f6eead8
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/run-all-tests b/packages/fcl-stl/tests/run-all-tests
new file mode 100755
index 0000000000..877c13424b
--- /dev/null
+++ b/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
diff --git a/packages/fcl-stl/tests/suiteconfig.pp b/packages/fcl-stl/tests/suiteconfig.pp
new file mode 100644
index 0000000000..ff18475a4c
--- /dev/null
+++ b/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.
diff --git a/packages/fcl-stl/tests/testrunner.pp b/packages/fcl-stl/tests/testrunner.pp
new file mode 100644
index 0000000000..3995c05738
--- /dev/null
+++ b/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.
+