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.
|
|
|
|
Tanya extends Phobos functionality and provides alternative implementations for
|
|
|
|
data structures and utilities that depend on the Garbage Collector in Phobos.
|
2016-12-08 14:43:50 +01:00
|
|
|
|
2017-06-02 22:01:13 +02:00
|
|
|
* [Bug tracker](https://issues.caraus.io/projects/tanya/issues)
|
2017-02-18 16:35:06 +01:00
|
|
|
* [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-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-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-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-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
|
|
|
|
|
2017-04-13 16:01:35 +02:00
|
|
|
| dmd |
|
|
|
|
|:-------:|
|
2017-07-21 05:44:45 +02:00
|
|
|
| 2.075.0 |
|
2017-06-02 22:01:13 +02:00
|
|
|
| 2.074.1 |
|
2017-04-13 16:01:35 +02:00
|
|
|
| 2.073.2 |
|
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
|
|
|
|
2017-06-07 08:04:50 +02:00
|
|
|
| Feature | Branch | Build status |
|
|
|
|
|----------|:---------:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
|
|
| BitArray | 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) |
|
|
|
|
| TLS | crypto | [![crypto](https://travis-ci.org/caraus-ecms/tanya.svg?branch=crypto)](https://travis-ci.org/caraus-ecms/tanya) [![crypto](https://ci.appveyor.com/api/projects/status/djkmverdfsylc7ti/branch/crypto?svg=true)](https://ci.appveyor.com/project/belka-ew/tanya/branch/crypto) |
|
|
|
|
| File IO | io | [![io](https://travis-ci.org/caraus-ecms/tanya.svg?branch=io)](https://travis-ci.org/caraus-ecms/tanya) [![io](https://ci.appveyor.com/api/projects/status/djkmverdfsylc7ti/branch/io?svg=true)](https://ci.appveyor.com/project/belka-ew/tanya/branch/io) |
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2017-06-22 02:56:18 +02:00
|
|
|
### Release management
|
|
|
|
|
|
|
|
3-week release cycle.
|
|
|
|
|
|
|
|
Deprecated features are removed after one release (in approximately 6 weeks after deprecating).
|
|
|
|
|
|
|
|
## Further characteristics
|
2016-12-24 22:25:34 +01:00
|
|
|
|
2017-06-07 08:04:50 +02:00
|
|
|
* Tanya is a native D library without any external dependencies.
|
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).
|