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