tanya/README.md

177 lines
6.5 KiB
Markdown
Raw Normal View History

# Tanya
2016-10-08 20:45:03 +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-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.
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)
* [Contribution guidelines](CONTRIBUTING.md)
2017-02-10 17:28:55 +01:00
## Overview
Tanya consists of the following packages and (top-level) modules:
* `async`: Event loop (epoll, kqueue and IOCP).
* `container`: Queue, Array, Singly and doubly linked lists, Buffers, UTF-8
string, Hash set.
* `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).
* `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.
* `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
same as described above, but:
2017-06-22 02:56:18 +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])
{
}
int i = arr[7]; // Access 7th element.
```
There are more containers in the `tanya.container` package.
2017-06-22 02:56:18 +02:00
2017-06-22 02:56:18 +02:00
## Development
2016-12-27 23:49:22 +01:00
### Supported compilers
| dmd |
|:-------:|
2017-06-02 22:01:13 +02:00
| 2.074.1 |
| 2.073.2 |
| 2.072.2 |
| 2.071.2 |
2016-12-27 23:49:22 +01:00
2016-12-24 22:25:34 +01:00
### Current status
Following modules are under development:
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
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.
## Feedback
Any feedback about your experience with tanya would be greatly appreciated. Feel free to
[contact me](mailto:info@caraus.de).