aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ext_depends/D-YAML/examples/yaml_gen/yaml_gen.d
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext_depends/D-YAML/examples/yaml_gen/yaml_gen.d')
-rw-r--r--src/ext_depends/D-YAML/examples/yaml_gen/yaml_gen.d316
1 files changed, 0 insertions, 316 deletions
diff --git a/src/ext_depends/D-YAML/examples/yaml_gen/yaml_gen.d b/src/ext_depends/D-YAML/examples/yaml_gen/yaml_gen.d
deleted file mode 100644
index b970c31..0000000
--- a/src/ext_depends/D-YAML/examples/yaml_gen/yaml_gen.d
+++ /dev/null
@@ -1,316 +0,0 @@
-
-///Random YAML generator. Used to generate benchmarking inputs.
-
-import std.algorithm;
-import std.conv;
-import std.datetime;
-import std.math;
-import std.random;
-import std.stdio;
-import std.string;
-import dyaml;
-
-
-Node config;
-Node function(bool)[string] generators;
-auto typesScalar = ["string", "int", "float", "bool", "timestamp", "binary"];
-auto typesScalarKey = ["string", "int", "float", "timestamp"];
-auto typesCollection = ["map","omap", "pairs", "seq", "set"];
-ulong minNodesDocument;
-ulong totalNodes;
-
-static this()
-{
- generators["string"] = &genString;
- generators["int"] = &genInt;
- generators["float"] = &genFloat;
- generators["bool"] = &genBool;
- generators["timestamp"] = &genTimestamp;
- generators["binary"] = &genBinary;
- generators["map"] = &genMap;
- generators["omap"] = &genOmap;
- generators["pairs"] = &genPairs;
- generators["seq"] = &genSeq;
- generators["set"] = &genSet;
-}
-
-real randomNormalized(const string distribution = "linear")
-{
- auto generator = Random(unpredictableSeed());
- const r = uniform!"[]"(0.0L, 1.0L, generator);
- switch(distribution)
- {
- case "linear":
- return r;
- case "quadratic":
- return r * r;
- case "cubic":
- return r * r * r;
- default:
- writeln("Unknown random distribution: ", distribution,
- ", falling back to linear");
- return randomNormalized("linear");
- }
-}
-
-long randomLong(const long min, const long max, const string distribution = "linear")
-{
- return min + cast(long)round((max - min) * randomNormalized(distribution));
-}
-
-real randomReal(const real min, const real max, const string distribution = "linear")
-{
- return min + (max - min) * randomNormalized(distribution);
-}
-
-dchar randomChar(const dstring chars)
-{
- return chars[randomLong(0, chars.length - 1)];
-}
-
-string randomType(string[] types)
-{
- auto probabilities = new uint[types.length];
- foreach(index, type; types)
- {
- probabilities[index] = config[type]["probability"].as!uint;
- }
- return types[dice(probabilities)];
-}
-
-Node genString(bool root = false)
-{
- auto range = config["string"]["range"];
-
- auto alphabet = config["string"]["alphabet"].as!dstring;
-
- const chars = randomLong(range["min"].as!uint, range["max"].as!uint,
- range["dist"].as!string);
-
- dchar[] result = new dchar[chars];
- result[0] = randomChar(alphabet);
- foreach(i; 1 .. chars)
- {
- result[i] = randomChar(alphabet);
- }
-
- return Node(result.to!string);
-}
-
-Node genInt(bool root = false)
-{
- auto range = config["int"]["range"];
-
- const result = randomLong(range["min"].as!int, range["max"].as!int,
- range["dist"].as!string);
-
- return Node(result);
-}
-
-Node genFloat(bool root = false)
-{
- auto range = config["float"]["range"];
-
- const result = randomReal(range["min"].as!real, range["max"].as!real,
- range["dist"].as!string);
-
- return Node(result);
-}
-
-Node genBool(bool root = false)
-{
- return Node([true, false][randomLong(0, 1)]);
-}
-
-Node genTimestamp(bool root = false)
-{
- auto range = config["timestamp"]["range"];
-
- auto hnsecs = randomLong(range["min"].as!ulong, range["max"].as!ulong,
- range["dist"].as!string);
-
- if(randomNormalized() <= config["timestamp"]["round-chance"].as!real)
- {
- hnsecs -= hnsecs % 10000000;
- }
-
- return Node(SysTime(hnsecs));
-}
-
-Node genBinary(bool root = false)
-{
- auto range = config["binary"]["range"];
-
- const bytes = randomLong(range["min"].as!uint, range["max"].as!uint,
- range["dist"].as!string);
-
- ubyte[] result = new ubyte[bytes];
- foreach(i; 0 .. bytes)
- {
- result[i] = cast(ubyte)randomLong(0, 255);
- }
-
- return Node(result);
-}
-
-Node nodes(const bool root, Node range, const string tag, const bool set = false)
-{
- auto types = config["collection-keys"].as!bool ? typesCollection : [];
- types ~= (set ? typesScalarKey : typesScalar);
-
- Node[] nodes;
- if(root)
- {
- while(!(totalNodes >= minNodesDocument))
- {
- nodes.assumeSafeAppend;
- nodes ~= generateNode(randomType(types));
- }
- }
- else
- {
- const elems = randomLong(range["min"].as!uint, range["max"].as!uint,
- range["dist"].as!string);
-
- nodes = new Node[elems];
- foreach(i; 0 .. elems)
- {
- nodes[i] = generateNode(randomType(types));
- }
- }
-
- return Node(nodes, tag);
-}
-
-Node genSeq(bool root = false)
-{
- return nodes(root, config["seq"]["range"], "tag:yaml.org,2002:seq");
-}
-
-Node genSet(bool root = false)
-{
- return nodes(root, config["seq"]["range"], "tag:yaml.org,2002:set", true);
-}
-
-Node pairs(bool root, bool complex, Node range, string tag)
-{
- Node[] keys, values;
-
- if(root)
- {
- while(!(totalNodes >= minNodesDocument))
- {
- const key = generateNode(randomType(typesScalarKey ~ (complex ? typesCollection : [])));
- // Maps can't contain duplicate keys
- if(tag.endsWith("map") && keys.canFind(key)) { continue; }
- keys.assumeSafeAppend;
- values.assumeSafeAppend;
- keys ~= key;
- values ~= generateNode(randomType(typesScalar ~ typesCollection));
- }
- }
- else
- {
- const pairs = randomLong(range["min"].as!uint, range["max"].as!uint,
- range["dist"].as!string);
-
- keys = new Node[pairs];
- values = new Node[pairs];
- outer: foreach(i; 0 .. pairs)
- {
- auto key = generateNode(randomType(typesScalarKey ~ (complex ? typesCollection : [])));
- // Maps can't contain duplicate keys
- while(tag.endsWith("map") && keys[0 .. i].canFind(key))
- {
- key = generateNode(randomType(typesScalarKey ~ (complex ? typesCollection : [])));
- }
- keys[i] = key;
- values[i] = generateNode(randomType(typesScalar ~ typesCollection));
- }
- }
-
- return Node(keys, values, tag);
-}
-
-Node genMap(bool root = false)
-{
- Node range = config["map"]["range"];
- const complex = config["complex-keys"].as!bool;
-
- return pairs(root, complex, range, "tag:yaml.org,2002:map");
-}
-
-Node genOmap(bool root = false)
-{
- Node range = config["omap"]["range"];
- const complex = config["complex-keys"].as!bool;
-
- return pairs(root, complex, range, "tag:yaml.org,2002:omap");
-}
-
-Node genPairs(bool root = false)
-{
- Node range = config["pairs"]["range"];
- const complex = config["complex-keys"].as!bool;
-
- return pairs(root, complex, range, "tag:yaml.org,2002:pairs");
-}
-
-Node generateNode(const string type, bool root = false)
-{
- ++totalNodes;
- return generators[type](root);
-}
-
-Node[] generate(const string configFileName)
-{
- config = Loader.fromFile(configFileName).load();
-
- minNodesDocument = config["min-nodes-per-document"].as!long;
-
- Node[] result;
- foreach(i; 0 .. config["documents"].as!uint)
- {
- result ~= generateNode(config["root-type"].as!string, true);
- totalNodes = 0;
- }
-
- return result;
-}
-
-
-void main(string[] args)
-{
- //Help message.
- if(args.length == 1)
- {
- writeln("Usage: yaml_gen FILE [CONFIG_FILE]\n");
- writeln("Generates a random YAML file and writes it to FILE.");
- writeln("If provided, CONFIG_FILE overrides the default config file.");
- return;
- }
-
- string configFile = args.length >= 3 ? args[2] : "config.yaml";
-
- try
- {
- //Generate and dump the nodes.
- Node[] generated = generate(configFile);
-
- auto dumper = dumper();
- auto encoding = config["encoding"];
-
- dumper.indent = config["indent"].as!uint;
- dumper.textWidth = config["text-width"].as!uint;
- switch(encoding.as!string)
- {
- case "utf-16": dumper.dump!wchar(File(args[1], "w").lockingTextWriter, generated); break;
- case "utf-32": dumper.dump!dchar(File(args[1], "w").lockingTextWriter, generated); break;
- default: dumper.dump!char(File(args[1], "w").lockingTextWriter, generated); break;
- }
- }
- catch(YAMLException e)
- {
- writeln("ERROR: ", e.msg);
- }
-}