X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/85bb21f7edaa024657a09129d52edf66d8ab7fa2..471f9daa24ee9251730e234fe92ad65c1fa9dff3:/man/darray.3 diff --git a/man/darray.3 b/man/darray.3 index 548299b..db50fd1 100644 --- a/man/darray.3 +++ b/man/darray.3 @@ -19,7 +19,7 @@ .. .ie t .ds o \(bu .el .ds o o -.TH darray 3 "21 October 1999" mLib +.TH darray 3 "21 October 1999" "Straylight/Edgeware" "mLib utilities library" .SH "NAME" darray \- dense, dynamically resizing arrays .\" @DA_INIT @@ -43,6 +43,8 @@ darray \- dense, dynamically resizing arrays .\" @DA_UNSAFE_SHRINK .\" @DA_UNSLIDE .\" @DA_UNSAFE_UNSLIDE +.\" @DA_FIRST +.\" @DA_LAST .\" @DA_PUSH .\" @DA_POP .\" @DA_UNSHIFT @@ -56,36 +58,38 @@ darray \- dense, dynamically resizing arrays .nf .B "#include " -.BI DA_DECL( atype ", " type ); -.IB atype " " a " = DA_INIT;" -.BI "void DA_CREATE(" atype " *" a ); -.BI "void DA_DESTROY(" atype " *" a ); +.BI DA_DECL( type_v ", " type ); +.IB type_v " " a " = DA_INIT;" +.BI "void DA_CREATE(" type_v " *" a ); +.BI "void DA_DESTROY(" type_v " *" a ); -.BI "void DA_ENSURE(" atype " *" a ", size_t " n ); -.BI "void DA_SHUNT(" atype " *" a ", size_t " n ); -.BI "void DA_TIDY(" atype " *" a ); -.BI "void DA_RESET(" atype " *" a ); +.BI "void DA_ENSURE(" type_v " *" a ", size_t " n ); +.BI "void DA_SHUNT(" type_v " *" a ", size_t " n ); +.BI "void DA_TIDY(" type_v " *" a ); +.BI "void DA_RESET(" type_v " *" a ); -.IB type " *DA(" atype " *" a ); -.BI "size_t DA_LEN(" atype " *" a ); -.BI "size_t DA_SPARE(" atype " *" a ); -.BI "size_t DA_OFFSET(" atype " *" a ); -.BI "void DA_INCLUDE(" atype " *" a ", size_t " i ); +.IB type " *DA(" type_v " *" a ); +.BI "size_t DA_LEN(" type_v " *" a ); +.BI "size_t DA_SPARE(" type_v " *" a ); +.BI "size_t DA_OFFSET(" type_v " *" a ); +.BI "void DA_INCLUDE(" type_v " *" a ", size_t " i ); -.BI "void DA_EXTEND(" atype " *" a ", long " n ); -.BI "void DA_SHRINK(" atype " *" a ", long " n ); -.BI "void DA_SLIDE(" atype " *" a ", long " n ); -.BI "void DA_UNSLIDE(" atype " *" a ", long " n ); +.BI "void DA_EXTEND(" type_v " *" a ", long " n ); +.BI "void DA_SHRINK(" type_v " *" a ", long " n ); +.BI "void DA_SLIDE(" type_v " *" a ", long " n ); +.BI "void DA_UNSLIDE(" type_v " *" a ", long " n ); -.BI "void DA_UNSAFE_EXTEND(" atype " *" a ", long " n ); -.BI "void DA_UNSAFE_SHRINK(" atype " *" a ", long " n ); -.BI "void DA_UNSAFE_SLIDE(" atype " *" a ", long " n ); -.BI "void DA_UNSAFE_UNSLIDE(" atype " *" a ", long " n ); +.BI "void DA_UNSAFE_EXTEND(" type_v " *" a ", long " n ); +.BI "void DA_UNSAFE_SHRINK(" type_v " *" a ", long " n ); +.BI "void DA_UNSAFE_SLIDE(" type_v " *" a ", long " n ); +.BI "void DA_UNSAFE_UNSLIDE(" type_v " *" a ", long " n ); -.BI "void DA_PUSH(" atype " *" a ", " type " " x ); -.IB type " DA_POP(" atype " *" a ); -.BI "void DA_UNSHIFT(" atype " *" a ", " type " " x ); -.IB type " DA_SHIFT(" atype " *" a ); +.IB type " DA_FIRST(" type_v " *" a ); +.IB type " DA_LAST(" type_v " *" a ); +.BI "void DA_PUSH(" type_v " *" a ", " type " " x ); +.IB type " DA_POP(" type_v " *" a ); +.BI "void DA_UNSHIFT(" type_v " *" a ", " type " " x ); +.IB type " DA_SHIFT(" type_v " *" a ); .BI "void *da_ensure(da_base *" b ", void *" v ", size_t " sz ", size_t " n ); .BI "void *da_shunt(da_base *" b ", void *" v ", size_t " sz ", size_t " n ); @@ -94,8 +98,8 @@ darray \- dense, dynamically resizing arrays .SH "DESCRIPTION" The .B -declares a collection of types, macros and functions which implement -dynamically resizing arrays. +header file declares a collection of types, macros and functions which +implement dynamically resizing arrays. .PP The macros described here may evaluate their arguments multiple times unless otherwise specified. @@ -105,19 +109,31 @@ type declared using the .B DA_DECL macro. Calling .VS -.BI DA_DECL( atype ", " type ); +.BI DA_DECL( type_v ", " type ); .VE Declares a new dynamic array type -.I atype +.I type_v whose elements have type .IR type . .PP +It is conventional to form the name of an array type by appending +.RB ` _v ' +to the base type name. If the base type is a standard type, or is +declared separately from the array, it's also conventional to declare a +macro with the same name as the array type only in uppercase which may +be used to prevent multiple declarations, e.g., +.VS +#ifndef FOO_V +# define FOO_V + DA_DECL(foo_v, foo); +#endif +.VE The macro .B DA_INIT is a valid static initializer for all types of dynamic arrays. For cases where this isn't appropriate, a dynamic array may be initialized using the macro -.BR DA_INIT , +.BR DA_CREATE , passing it the address of the array. .PP Arrays may be disposed of using the @@ -167,7 +183,7 @@ is the base address of the actual array. The elements are stored contiguously starting at this address. An element at index .I i may be referenced using the syntax -.BI DA( a )[ i \fR. +.BI DA( a )[ i ]\fR. .PP The number of elements in the array .I a @@ -272,7 +288,8 @@ and respectively, except that they interpret the sign of their second arguments in the opposite way. This is useful if the argument is unsigned (e.g., if it's based on -.BR DA_LEN ). There are unsafed versions of both these macros too. +.BR DA_LEN ). +There are unsafe versions of both these macros too. .SS "Stack operations" Dynamic arrays support Perl-like stack operations. Given an array (pointer) @@ -316,6 +333,13 @@ and can fail because the array is empty, in which case .B DAEXC_UFLOW is thrown. +.PP +The operations +.B DA_FIRST +and +.B DA_LAST +are lvalues referring to the first and last elements in the array +respectively. They are unsafe if the array is empty. .SS "Low-level details" This section describes low-level details of the dynamic array implementation. You should try to avoid making use of this information @@ -325,10 +349,10 @@ miss. .PP Dynamic arrays are structures with the format .VS -.BI "typedef struct " atype " {" +.BI "typedef struct " type_v " {" .B " da_base b;" .BI " " type " *v;" -.BI "} " atype ";" +.BI "} " type_v ";" .VE The pointer .B v