diff options
author | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-04-03 09:15:56 +0000 |
---|---|---|
committer | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-04-03 09:15:56 +0000 |
commit | d701d26e700344378958eb27c45723d9aa6da224 (patch) | |
tree | 9d28d8a8514e70cb4a4f47ec54375a65b3606dd0 | |
parent | 14762c7885de0eabafe72c9c035e44ae9b364133 (diff) | |
download | fpc-d701d26e700344378958eb27c45723d9aa6da224.tar.gz |
* Initial check-in of stl
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@17233 3ad0048d-3df7-0310-abae-a5850022a9f2
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. + |