It will get few more dependencies and code bloat.
Regarding the code bloat. This module clearly shows the excessive use of the "inline" directive. It is often placed wherever the code "looks" small, but it is not.
Let's take a simple example:
{$MODE OBJFPC}
{$APPTYPE CONSOLE}
uses gdeque;
type
TDequeString = specialize TDeque<AnsiString>;
var
A: TDequeString;
begin
A := TDequeString.Create;
try
A.PushBack('Test');
Writeln(A.Back);
finally
A.Free;
end;
end.
Let's examine the generated code (FPC 3.2.0, x64, Intel, optimization level 3) for the Create:
# [13] A := TDequeString.Create;
movl $1,%eax
leaq VMT_$P$PROJECT1_$$_TDEQUE$1$CRC6824777A(%rip),%rcx
movq %rax,%rdx
call P$PROJECT1$_$TDEQUE$1$CRC6824777A_$__$$_CREATE$$TDEQUE$1$CRC6824777A
movq %rax,U_$P$PROJECT1_$$_A(%rip)
Small and adequate - because it's not "inline".
Now let's look at the PushBack:
# [15] A.PushBack('Test');
leaq -8(%rbp),%rcx
call fpc_ansistr_decr_ref
leaq .Ld2(%rip),%rdx
leaq -8(%rbp),%rcx
call fpc_ansistr_assign
.Ll182:
movq U_$P$PROJECT1_$$_A(%rip),%rdx
.Ll183:
movq 16(%rdx),%rax
cmpq 24(%rdx),%rax
.Ll184:
jne .Lj254
.Ll185:
movq U_$P$PROJECT1_$$_A(%rip),%rax
movq 24(%rax),%rbx
movq U_$P$PROJECT1_$$_A(%rip),%rax
movq 24(%rax),%rax
shlq $3,%rax
movq U_$P$PROJECT1_$$_A(%rip),%rdx
cmpq $0,24(%rdx)
jne .Lj257
movq U_$P$PROJECT1_$$_A(%rip),%rdx
movq $4,24(%rdx)
jmp .Lj258
.Lj257:
cmpq $1048576,%rax
jnb .Lj260
.Ll186:
movq U_$P$PROJECT1_$$_A(%rip),%rcx
.Ll187:
shlq $1,24(%rcx)
jmp .Lj261
.Lj260:
cmpq $268435456,%rax
jnb .Lj263
.Ll188:
movq U_$P$PROJECT1_$$_A(%rip),%rcx
movq 24(%rcx),%rdx
.Ll189:
movq %rdx,%rax
shrq $3,%rax
addq %rdx,%rax
movq %rax,24(%rcx)
jmp .Lj264
.Lj263:
.Ll190:
movq U_$P$PROJECT1_$$_A(%rip),%rcx
movq 24(%rcx),%rdx
.Ll191:
movq %rdx,%rax
shrq $4,%rax
addq %rdx,%rax
movq %rax,24(%rcx)
.Lj264:
.Lj261:
.Lj258:
movq U_$P$PROJECT1_$$_A(%rip),%rax
movq 24(%rax),%rax
movq %rax,-16(%rbp)
leaq RTTI_$P$PROJECT1_$$_def00000002(%rip),%rdx
movq U_$P$PROJECT1_$$_A(%rip),%rax
leaq 8(%rax),%rcx
leaq -16(%rbp),%r9
movl $1,%r8d
call fpc_dynarray_setlength
movq U_$P$PROJECT1_$$_A(%rip),%rax
cmpq $0,32(%rax)
jna .Lj266
movq U_$P$PROJECT1_$$_A(%rip),%rax
movq 32(%rax),%rax
leaq -1(%rax),%rsi
movq $-1,%rdi
.balign 8,0x90
.Lj267:
addq $1,%rdi
movq U_$P$PROJECT1_$$_A(%rip),%rax
movq 8(%rax),%rax
movq (%rax,%rdi,8),%rdx
movq U_$P$PROJECT1_$$_A(%rip),%rax
movq 8(%rax),%rcx
leaq (%rbx,%rdi),%rax
leaq (%rcx,%rax,8),%rcx
call fpc_ansistr_assign
cmpq %rdi,%rsi
jnbe .Lj267
.balign 4,0x90
.Lj266:
.balign 4,0x90
.Lj254:
.Ll192:
movq U_$P$PROJECT1_$$_A(%rip),%rcx
.Ll193:
movq 8(%rcx),%r8
movq 32(%rcx),%rdx
movq 16(%rcx),%rax
addq %rdx,%rax
xorl %edx,%edx
divq 24(%rcx)
leaq (%r8,%rdx,8),%rcx
movq -8(%rbp),%rdx
call fpc_ansistr_assign
movq U_$P$PROJECT1_$$_A(%rip),%rax
addq $1,16(%rax)
And so it will be for
every PushBack. Let me remind: the 3rd level of optimization!
Library authors should take a closer look at when to use the inline directive.