qContainers is a container library for Fortran language. It enables to store any internal Fortran data type and any derived data type to the container. The library wraps a subset of containers from qLibc library for C language and one container (set) from c-algorithms library.
Following containers are implemented currently:
- Containers for Key/Value pairs
- Tree Table (qtreetbl) --- in binary tree (left-leaning red-black tree) data structure.
- Hash Table (qhashtbl) --- in hash-based data structure.
- Containers for Objects
- List (qlist) --- doubly linked list.
- Vector (qvector) --- growable array of elements.
- Set (qset) --- collection of unique values.
The library uses some features of Fortran 2003 and TS-29113, therefore a relatively new compiler version is required. Assumed-type dummy arguments or compiler directives in the case the compiler doesn't support assumed-type variables are used to enable store of any type to the containers. The containers were tested with Gfortran, Intel, PGI and Oracle Fortran compilers.
qContainers is published under 2-clause BSD license known as Simplified BSD License. Please refer the LICENSE.txt document included in the repository for more details.
All container APIs have a consistent look and feel. Type-bound procedures are used to make the use of the containers more convenient.
An example below illustrates how it looks like.
subroutine colors() use qtreetbl_m implicit none type(qtreetbl_t) :: col integer :: val(3) integer :: ret_val(3) integer :: ns logical :: found ! Determine the size in bytes we need to save ! ns is a number of bytes for 3 integers ns = storage_size(val) / 8 * size(val) ! Create a new tree-table call col%new(ns) ! Put some values val = [255, 0, 0] call col%put("red", val(1)) ! ns bytes from val is copied val = [0, 255, 0] call col%put("green", val(1)) !......... ! Retrieve value call col%get("red", ret_val(1), found) print *, "red color = ", ret_val end subroutine
Read INSTALL.md file.
An introduction tutorial can be found in docs folder. Also, the library has rather extensive test-cases from which users can learn how to use the library.
You can contribute to this project by reporting bugs, suggesting new features, implementing new features/containers, writing documentation/tutorial or simply by spreading the word about it.