2016-12-08 14:43:50 +01:00
|
|
|
# Tanya
|
2016-10-08 20:45:03 +02:00
|
|
|
|
2021-03-30 08:33:45 +02:00
|
|
|
[![CI/CD](https://img.shields.io/badge/CI-CD-brightgreen)](https://build.caraus.tech/go/pipelines)
|
2017-01-07 15:25:05 +01:00
|
|
|
[![Dub version](https://img.shields.io/dub/v/tanya.svg)](https://code.dlang.org/packages/tanya)
|
|
|
|
[![Dub downloads](https://img.shields.io/dub/dt/tanya.svg)](https://code.dlang.org/packages/tanya)
|
2021-04-15 09:38:59 +02:00
|
|
|
[![License: MPL 2.0](https://img.shields.io/badge/license-MPL_2.0-blue.svg)](https://opensource.org/licenses/MPL-2.0)
|
2016-12-08 15:00:09 +01:00
|
|
|
|
2017-01-09 17:03:09 +01:00
|
|
|
Tanya is a general purpose library for D programming language.
|
2016-12-07 23:16:49 +01:00
|
|
|
|
2016-12-24 22:25:34 +01:00
|
|
|
Its aim is to simplify the manual memory management in D and to provide a
|
|
|
|
guarantee with @nogc attribute that there are no hidden allocations on the
|
|
|
|
Garbage Collector heap. Everything in the library is usable in @nogc code.
|
2017-12-02 10:40:40 +01:00
|
|
|
Tanya provides data structures and utilities to facilitate painless systems
|
|
|
|
programming in D.
|
2016-12-08 14:43:50 +01:00
|
|
|
|
2021-12-27 10:57:05 +01:00
|
|
|
- [API Documentation](https://docs.caraus.tech/tanya)
|
2017-07-16 18:56:48 +02:00
|
|
|
|
2016-12-08 18:30:22 +01:00
|
|
|
## Overview
|
|
|
|
|
2017-07-16 18:56:48 +02:00
|
|
|
Tanya consists of the following packages and (top-level) modules:
|
2016-12-08 14:43:50 +01:00
|
|
|
|
2017-10-29 07:51:00 +01:00
|
|
|
* `algorithm`: Collection of generic algorithms.
|
2017-01-04 20:37:55 +01:00
|
|
|
* `async`: Event loop (epoll, kqueue and IOCP).
|
2018-09-16 18:15:35 +02:00
|
|
|
* `bitmanip`: Bit manipulation.
|
2017-05-15 20:09:32 +02:00
|
|
|
* `container`: Queue, Array, Singly and doubly linked lists, Buffers, UTF-8
|
2018-05-17 05:31:14 +02:00
|
|
|
string, Set, Hash table.
|
2017-10-10 06:59:34 +02:00
|
|
|
* `conv`: This module provides functions for converting between different
|
|
|
|
types.
|
2017-06-19 09:13:02 +02:00
|
|
|
* `format`: Formatting and conversion functions.
|
2018-03-15 19:10:24 +01:00
|
|
|
* `hash`: Hash algorithms.
|
2017-01-25 07:24:19 +01:00
|
|
|
* `math`: Arbitrary precision integer and a set of functions.
|
2017-06-07 08:04:50 +02:00
|
|
|
* `memory`: Tools for manual memory management (allocators, smart pointers).
|
2017-09-09 11:48:30 +02:00
|
|
|
* `meta`: Template metaprogramming. This package contains utilities to acquire
|
|
|
|
type information at compile-time, to transform from one type to another. It has
|
|
|
|
also different algorithms for iterating, searching and modifying template
|
|
|
|
arguments.
|
2017-07-16 18:56:48 +02:00
|
|
|
* `net`: URL-Parsing, network programming.
|
2017-06-16 21:41:23 +02:00
|
|
|
* `os`: Platform-independent interfaces to operating system functionality.
|
2017-08-25 00:29:43 +02:00
|
|
|
* `range`: Generic functions and templates for D ranges.
|
2017-10-12 07:41:35 +02:00
|
|
|
* `test`: Test suite for unittest-blocks.
|
2017-07-16 18:56:48 +02:00
|
|
|
* `typecons`: Templates that allow to build new types based on the available
|
|
|
|
ones.
|
|
|
|
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2018-03-17 08:17:51 +01:00
|
|
|
## NogcD
|
|
|
|
|
|
|
|
To achieve programming without the Garbage Collection tanya uses a subset of D:
|
|
|
|
NogcD.
|
2017-06-22 02:56:18 +02:00
|
|
|
|
|
|
|
### Allocators
|
|
|
|
|
|
|
|
Memory management is done with allocators. Instead of using `new` to create an
|
|
|
|
instance of a class, an allocator is used:
|
|
|
|
|
|
|
|
```d
|
|
|
|
import tanya.memory;
|
|
|
|
|
|
|
|
class A
|
|
|
|
{
|
|
|
|
this(int arg)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
A a = defaultAllocator.make!A(5);
|
|
|
|
|
|
|
|
defaultAllocator.dispose(a);
|
|
|
|
```
|
|
|
|
|
|
|
|
As you can see, the user is responsible for deallocation, therefore `dispose`
|
|
|
|
is called at the end.
|
|
|
|
|
|
|
|
If you want to change the `defaultAllocator` to something different, you
|
|
|
|
probably want to do it at the program's beginning. Or you can invoke another
|
|
|
|
allocator directly. It is important to ensure that the object is destroyed
|
|
|
|
using the same allocator that was used to allocate it.
|
|
|
|
|
|
|
|
What if I get an allocated object from some function? The generic rule is: If
|
|
|
|
you haven't requested the memory yourself (with `make`), you don't need to free
|
|
|
|
it.
|
|
|
|
|
|
|
|
`tanya.memory.smartref` contains smart pointers, helpers that can take care of
|
|
|
|
a proper deallocation in some cases for you.
|
|
|
|
|
|
|
|
### Exceptions
|
|
|
|
|
|
|
|
Since exceptions are normal classes in D, they are allocated and dellocated the
|
2017-06-29 11:06:40 +02:00
|
|
|
same as described above, but:
|
2017-06-22 02:56:18 +02:00
|
|
|
|
2017-06-29 11:06:40 +02:00
|
|
|
1. The caller is **always** responsible for destroying a caught exception.
|
|
|
|
2. Exceptions are **always** allocated and should be always allocated with the
|
2017-06-22 02:56:18 +02:00
|
|
|
`defaultAllocator`.
|
|
|
|
|
|
|
|
```d
|
|
|
|
import tanya.memory;
|
|
|
|
|
|
|
|
void functionThatThrows()
|
|
|
|
{
|
|
|
|
throw defaultAlocator.make!Exception("An error occurred");
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
functionThatThrows()
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
defaultAllocator.dispose(e);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2018-03-17 08:17:51 +01:00
|
|
|
### Built-in array operations and containers
|
2017-06-22 02:56:18 +02:00
|
|
|
|
|
|
|
Arrays are commonly used in programming. D's built-in arrays often rely on the
|
|
|
|
GC. It is inconvenient to change their size, reserve memory for future use and
|
|
|
|
so on. Containers can help here. The following example demonstrates how
|
|
|
|
`tanya.container.array.Array` can be used instead of `int[]`.
|
|
|
|
|
|
|
|
```d
|
|
|
|
import tanya.container.array;
|
|
|
|
|
|
|
|
Array!int arr;
|
|
|
|
|
|
|
|
// Reserve memory if I know that my container will contain approximately 15
|
|
|
|
// elements.
|
|
|
|
arr.reserve(15);
|
|
|
|
|
|
|
|
arr.insertBack(5); // Add one element.
|
|
|
|
arr.length = 10; // New elements are initialized to 0.
|
|
|
|
|
|
|
|
// Iterate over the first five elements.
|
|
|
|
foreach (el; arr[0 .. 5])
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-08-08 05:59:04 +02:00
|
|
|
int i = arr[7]; // Access 8th element.
|
2017-06-22 02:56:18 +02:00
|
|
|
```
|
|
|
|
|
2017-06-29 11:06:40 +02:00
|
|
|
There are more containers in the `tanya.container` package.
|
2017-06-22 02:56:18 +02:00
|
|
|
|
2017-07-16 18:56:48 +02:00
|
|
|
|
2018-03-17 08:17:51 +01:00
|
|
|
### Immutability
|
|
|
|
|
|
|
|
Immutability doesn't play nice with manual memory management since the
|
|
|
|
allocated storage should be initialized (mutated) and then released (mutated).
|
|
|
|
`immutable` is used only for non-local immutable declarations (that are
|
|
|
|
evaluated at compile time), static immutable data, strings (`immutable(char)[]`,
|
|
|
|
`immutable(wchar)[]` and `immutable(dchar)[]`).
|
|
|
|
|
|
|
|
|
|
|
|
### Unsupported features
|
|
|
|
|
|
|
|
The following features depend on GC and aren't supported:
|
|
|
|
|
|
|
|
- `lazy` parameters (allocate a closure which is evaluated when then the
|
|
|
|
parameter is used)
|
|
|
|
|
|
|
|
- `synchronized` blocks
|
|
|
|
|
|
|
|
|
2017-06-22 02:56:18 +02:00
|
|
|
## Development
|
|
|
|
|
2016-12-27 23:49:22 +01:00
|
|
|
### Supported compilers
|
|
|
|
|
2019-08-28 20:50:15 +02:00
|
|
|
| DMD | GCC |
|
|
|
|
|:-------:|:---------:|
|
2021-05-29 09:50:47 +02:00
|
|
|
| 2.096.0 | 10.3 |
|
2017-06-22 02:56:18 +02:00
|
|
|
|
|
|
|
## Further characteristics
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2018-03-17 08:17:51 +01:00
|
|
|
- Tanya is a native D library
|
|
|
|
|
|
|
|
- Tanya is cross-platform. The development happens on a 64-bit Linux, but it
|
|
|
|
is being tested on Windows and FreeBSD as well
|
|
|
|
|
|
|
|
- Tanya favours generic algorithms therefore there is no auto-decoding. Char
|
|
|
|
arrays are handled as any other array type
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2018-03-17 08:17:51 +01:00
|
|
|
- The library isn't thread-safe yet
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2018-03-17 08:17:51 +01:00
|
|
|
- Complex numbers (`cfloat`, `cdouble`, `creal`, `ifloat`, `idouble`, `ireal`)
|
|
|
|
aren't supported
|
2017-07-16 18:56:48 +02:00
|
|
|
|
|
|
|
|
|
|
|
## Feedback
|
|
|
|
|
|
|
|
Any feedback about your experience with tanya would be greatly appreciated. Feel free to
|
2021-04-15 09:38:59 +02:00
|
|
|
[contact me](mailto:belka@caraus.de).
|