On Monday, 25 April 2022 at 02:19:46 UTC, Ali Çehreli wrote:

This type violates a fundamental rule: Containers and ranges are separate concepts. Your List is a container, not a range. I changed your code by moving the range functions to a Range [...]

Dear Ali,

I implemented a linkedlist over classical logic (*_leaf and const *_root). Now seeing the ranges approach I tried it but without success. The following implementation can work with foreach() though; as long as you call goRoot() :)

```d
class List(dType) {
  struct Node
  {
    dType item;
    Node* next;
  }
  bool FIFO;
  private Node * _leaf;

  this(bool FIFO = true, dType item = dType.init) {
    this.FIFO = FIFO;
    if(FIFO) _leaf= new Node(item, null);
    _root = cast(const)_leaf;
  }

  /*
  auto opSlice() { return Range(_leaf); }
  static struct Range {//*/
    const Node * _root;

    auto empty()
    {
      return !_leaf;
    }

    auto popFront()
    {
      return _leaf = _leaf.next;
    }

    dType front(Node * node = null)
    {
      dType result;
      if(node)
      {
        result = (*node).item;
      } else result = (*_leaf).item;

      return result;
    }
  //}

  alias Next = popFront;
  alias pop = front;
  alias push = InsertBack;

  void InsertBack(dType item)
  {
    _leaf = new Node(item, _leaf);
  }

  void InsertFront(dType item)
  {
    (*_leaf).next = new Node(item, null);
    Next;
  }

  auto goRoot()
  {
    return _leaf = cast(Node*)_root.next;
  }
}

import std.stdio;

enum FIFO { False, True }
enum end = 20;
void main()
{
  int firstNumber = 10;
  auto FIFO_Stack = new List!int;
  with(FIFO_Stack)
  {
    do {
      InsertFront(firstNumber);
    } while(++firstNumber <= end);

    goRoot();

    do pop.writef!"  %s"; while(Next);
    writeln;
  }

  FIFO_Stack.goRoot();

  foreach(stack; FIFO_Stack) {
    stack.writeln;
  }
} /* OUTPUT:
  10  11  12  13  14  15  16  17  18  19  20
10
11
12
13
14
15
16
17
18
19
20
*/
```
SDB@79

Reply via email to