2016-12-08 14:43:50 +01:00
|
|
|
# Tanya
|
2016-10-08 20:45:03 +02:00
|
|
|
|
2017-05-11 06:26:59 +02:00
|
|
|
[![Build status](https://travis-ci.org/caraus-ecms/tanya.svg?branch=master)](https://travis-ci.org/caraus-ecms/tanya)
|
|
|
|
[![Build status](https://ci.appveyor.com/api/projects/status/djkmverdfsylc7ti/branch/master?svg=true)](https://ci.appveyor.com/project/belka-ew/tanya/branch/master)
|
2017-05-11 13:15:04 +02:00
|
|
|
[![codecov](https://codecov.io/gh/caraus-ecms/tanya/branch/master/graph/badge.svg)](https://codecov.io/gh/caraus-ecms/tanya)
|
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)
|
2016-12-24 22:25:34 +01:00
|
|
|
[![License](https://img.shields.io/badge/license-MPL_2.0-blue.svg)](https://raw.githubusercontent.com/caraus-ecms/tanya/master/LICENSE)
|
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
|
|
|
|
2017-09-02 09:48:28 +02:00
|
|
|
* [API Documentation](https://docs.caraus.io/tanya)
|
2017-06-29 11:06:40 +02:00
|
|
|
* [Contribution guidelines](CONTRIBUTING.md)
|
2017-02-10 17:28:55 +01:00
|
|
|
|
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).
|
2017-05-15 20:09:32 +02:00
|
|
|
* `container`: Queue, Array, Singly and doubly linked lists, Buffers, UTF-8
|
2017-05-29 10:58:37 +02:00
|
|
|
string, Hash set.
|
2017-10-10 06:59:34 +02:00
|
|
|
* `conv`: This module provides functions for converting between different
|
|
|
|
types.
|
2017-09-24 18:08:47 +02:00
|
|
|
* `encoding`: This package provides tools to work with text encodings.
|
2017-10-10 06:59:34 +02:00
|
|
|
* `exception`: Common exceptions and errors.
|
2017-06-19 09:13:02 +02:00
|
|
|
* `format`: Formatting and conversion functions.
|
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.
|
|
|
|
* `network`: Socket implementation. `network` is currently under rework.
|
|
|
|
After finishing the new socket implementation will land in the `net` package and
|
|
|
|
`network` will be deprecated.
|
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
|
|
|
|
2017-06-22 02:56:18 +02:00
|
|
|
## Basic usage
|
|
|
|
|
|
|
|
### 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);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### Containers
|
|
|
|
|
|
|
|
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
|
|
|
|
2017-06-22 02:56:18 +02:00
|
|
|
## Development
|
|
|
|
|
2016-12-27 23:49:22 +01:00
|
|
|
### Supported compilers
|
|
|
|
|
2018-03-15 05:46:42 +01:00
|
|
|
| DMD | GCC |
|
|
|
|
|:-------:|:---------:|
|
|
|
|
| 2.079.0 | *master* |
|
|
|
|
| 2.078.3 | |
|
|
|
|
| 2.077.1 | |
|
|
|
|
| 2.076.1 | |
|
2016-12-27 23:49:22 +01:00
|
|
|
|
2016-12-24 22:25:34 +01:00
|
|
|
### Current status
|
|
|
|
|
2017-05-19 20:01:04 +02:00
|
|
|
Following modules are under development:
|
2017-04-13 16:01:35 +02:00
|
|
|
|
2018-03-15 05:46:42 +01:00
|
|
|
| Feature | Branch | Build status |
|
|
|
|
|------------|:---------:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
|
|
| Hash table | bitvector | [![bitvector](https://travis-ci.org/caraus-ecms/tanya.svg?branch=bitvector)](https://travis-ci.org/caraus-ecms/tanya) [![bitvector](https://ci.appveyor.com/api/projects/status/djkmverdfsylc7ti/branch/bitvector?svg=true)](https://ci.appveyor.com/project/belka-ew/tanya/branch/bitvector) |
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2017-06-22 02:56:18 +02:00
|
|
|
### Release management
|
|
|
|
|
2018-01-04 05:36:46 +01:00
|
|
|
Deprecated features are removed after one release that includes these deprecations.
|
2017-06-22 02:56:18 +02:00
|
|
|
|
|
|
|
## Further characteristics
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2018-02-23 18:00:23 +01:00
|
|
|
* Tanya is a native D library
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2016-12-27 23:49:22 +01:00
|
|
|
* Tanya is cross-platform. The development happens on a 64-bit Linux, but it
|
2017-01-01 02:51:49 +01:00
|
|
|
is being tested on Windows and FreeBSD as well.
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2017-06-02 22:01:13 +02:00
|
|
|
* The library isn't thread-safe yet.
|
2017-07-16 18:56:48 +02:00
|
|
|
|
|
|
|
|
|
|
|
## Feedback
|
|
|
|
|
|
|
|
Any feedback about your experience with tanya would be greatly appreciated. Feel free to
|
|
|
|
[contact me](mailto:info@caraus.de).
|