1 /**
2 *   Copyright: © 2012-2014 Anton Gushcha
3 *   License: Subject to the terms of the MIT license, as written in the included LICENSE file.
4 *   Authors:  NCrashed <ncrashed@gmail.com>,
5 *             LeMarwin <lemarwin42@gmail.com>,
6 *             Nazgull09 <nazgull90@gmail.com>
7 */
8 module devol.std.argpod;
9 
10 import std.conv;
11 import std.random;
12 
13 import devol.typemng;
14 
15 class ArgPod(T) : Argument
16 {
17 	this()
18 	{
19 		super( TypeMng.getSingleton().getType("Type"~T.stringof) );
20 	}
21 	
22 	ref ArgPod!T opAssign(Argument val)
23 	{
24 		auto apod = cast(ArgPod!T)(val);
25 		if (apod is null) return this;
26 		
27 		mVal = apod.mVal;
28 		return this;
29 	}
30 	
31 	ref ArgPod!T opAssign(T val)
32 	{
33 		mVal = val;
34 		return this;
35 	}
36 	
37 	override @property string tostring(uint depth=0)
38 	{
39 		return to!string(mVal);
40 	}
41 	
42 	@property T val()
43 	{
44 		return mVal;
45 	}
46 	
47 	@property T value()
48 	{
49 		return mVal;
50 	}
51 	
52 	override void randomChange()
53 	{
54 		static if (!is(T == bool))
55 		{
56 			mVal = uniform!"[]"(-mVal.max, mVal.max);
57 		} else
58 		{
59 			mVal = uniform!"[]"(0, 1) != 0;
60 		}
61 	}
62 	
63 	override void randomChange(string maxChange)
64 	{
65 		static if (!is(T == bool))
66 		{
67 			T ch;
68 			try
69 			{
70 				ch = to!T(maxChange);
71 			} catch( Exception e )
72 			{
73 				return;
74 			}
75 			
76 			mVal = uniform!"[]"(cast(T)(mVal-ch), cast(T)(mVal+ch));
77 		} else
78 		{
79 			mVal = uniform!"[]"(0, 1) != 0;
80 		}
81 	}
82 	
83 	override @property Argument dup()
84 	{
85 		auto darg = new ArgPod!T();
86 		darg.mVal = mVal;
87 		return darg;
88 	}
89 	
90 	protected T mVal;
91 }