Embedded non-assignable containers
José Armando García Sancio
jsancio at gmail.com
Sat Sep 1 15:10:29 PDT 2012
Hey,
I recently read an interesting blog Why should I have written ZeroMQ in C,
not C++ (part II) <http://www.250bpm.com/blog:8> by Martin Sústrik. The
title is misleading; to me its main observation is that object oriented
program may not lead to the most performant implementation. After reading
the blog I asked myself I would I implement this in D? I thought we could
use mixin and template mixin to implement this in a more
manageable/scalable way. The complete source code is at Embedded
Container<http://dpaste.dzfl.pl/14ddac09>
.
To make a type "double linkable" the developer needs to mixin the following
mixin template:
mixin template DoubleLinkable()
> {
> typeof(this) next;
> typeof(this) prev;
> }
The next and prev pointer can be access with the help of mixin by using the
following templates:
T* next(T, string name)(T node) pure nothrow const
{
mixin("return &(node." ~ name ~ ".next);");
}
T* prev(T, string name)(T node) pure nothrow const
{
mixin("return &(node." ~ name ~ ".prev);");
}
To use the above abstraction the developer just needs to do the following:
class Person
> {
> int age;
> int weight;
> mixin DoubleLinkable people;
> }
void main()
{
auto list = new DoubleLinkedList!(Person, "people")();
> auto person1 = new Person(6, 60);
list.pushFront(person1);
> auto person2 = new Person(25, 160);
list.pushFront(person2);
> auto person3 = new Person(11, 100);
list.pushFront(person3);
> list.erase(person2);
list.erase(person3);
list.erase(person1);
}
I am not a big fan of the template signature 'class DoubleLinkedList(T,
string name)' but I couldn't figure out a better way of allowing one object
to be embedded in multiple containers. Thoughts? Any idea how this can be
improved so that it is easier to use and read?
Thanks,
-Jose
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20120901/a6069687/attachment.html>
More information about the Digitalmars-d
mailing list