On Friday, 22 August 2014 at 18:21:06 UTC, Vicente wrote:

@Wyatt:
Certainly ref parameters help a lot, but I'm trying to get a "Node" by returning (a reference to) it. Does the ref keyword apply to the return type?

I poked it a bit and came out with this. I _think_ it's working as expected:
import std.stdio;
import std.string;

// struct or class
struct Node {
        Node[] block;
        uint num = 0;
};

// static immutable
Node[] default_nodes = [
        {num:3},
        {block:[{num:4},{num:6},{block:[{num:5},{num:7}]}]},
        // ...
];

class NodeProvider{
        // change to const after constructor
        private Node[] nodes;

        private void parse_file(char[] file_name){
                // initialize nodes from file
                for(auto i=0; i<3; i++){
                        nodes.length++;
                        nodes[$-1].num=i;
                }
        }

        this(){
                nodes = default_nodes;
        }
        this(char[] file_name){
                parse_file(file_name);
        }

        auto ref opSlice(){return nodes[];};
}

string NodetoString(ref Node n){
        string str = format("%u{ ", n.num);
        foreach(b;n.block)
                str ~= NodetoString(b);
        str ~= "} ";
        return str;
}

int main(char[][] args){
        NodeProvider np;

        if(args.length==2)
                np = new NodeProvider(args[1]);
        else
                np = new NodeProvider();

        foreach(node_ref; np){
                writeln(NodetoString(node_ref));
        }
        return 0;
}

-Wyatt

Reply via email to