digitalmars.D.bugs - [Issue 4266] New: add support for structs in std.format.doFormat
- d-bugmail puremagic.com (33/33) Jun 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4266
- d-bugmail puremagic.com (33/33) Jun 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4266
- d-bugmail puremagic.com (29/29) Jun 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4266
- d-bugmail puremagic.com (24/25) Feb 18 2013 http://d.puremagic.com/issues/show_bug.cgi?id=4266
http://d.puremagic.com/issues/show_bug.cgi?id=4266
Summary: add support for structs in std.format.doFormat
Product: D
Version: 2.000
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: Phobos
AssignedTo: nobody puremagic.com
ReportedBy: mrmocool gmx.de
Currently there is a check if a struct has a toString member and it fails if
not.
It is really cumbersome to code a toString() by hand for every little struct.
if (tis.xtoString is null)
throw new FormatError("Can't convert " ~ tis.toString() ~ " to string:
\"string toString()\" not defined");
s = tis.xtoString(argptr);
Especially if you are dealing with external headers (in my case Windows/DirectX
headers) you have to face lots of structures that don't have a toString method.
Please add support for a default struct toString that uses the "{membername:
value, member2:value, member3:{mm1:v, ....}}" style just like arrays are
formatted as "[a, b, c, d,...]" and AAs as "[k1:v1, k2:v2, ..]" by default.
==>
if (tis.xtoString is null)
putStruct(....);
else
s = tis.xtoString(argptr);
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4266
This is an (inefficient) workaround, but it does its job until this is fixed.
import std.string : format;
string myformat(T...)(T ts)
{
string res;
foreach (t; ts)
{
static if (is (typeof(t) U : U*) && !is(U == void)) // is a pointer
{
res ~= myformat(*t);
}
else static if (is (typeof(t) == struct))
{
res ~= "{";
foreach(i, el; t.tupleof)
{
res ~= t.tupleof[i].stringof[2..$] ~ ":" ~ myformat(el); // the
slice cuts off the "t." that is always prepended
static if (i < t.tupleof.length-1)
res ~= ", ";
}
res ~= "}";
}
else
res ~= format(t);
}
return res;
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4266
add this branch (+ import std.traits;)
else static if (isSomeString!(typeof(t))) // enclose a string in ""
res ~= `"` ~ t ~ `"`;
and it nearly matches the C struct intialization style (except for pointers,
then you need to remove the first branch):
struct S
{
int a;
S2* p;
S2 adad;
}
struct S2
{
byte[4] aaaa = [0,1,2,3];
string ddd = "asd";
}
void main()
{
S2 sss = S2([5,4,5,4], "foo");
S s = S(2, &sss);
write(myformat(s));
}
gives:
{a:2, p:{aaaa:[5,4,5,4], ddd:"foo"}, adad:{aaaa:[0,1,2,3], ddd:"asd"}}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4266
Andrej Mitrovic <andrej.mitrovich gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |andrej.mitrovich gmail.com
10:08:30 PST ---
Did the code used to just fail to compile before? Now it prints the values:
import std.string;
import std.stdio;
struct S
{
int x;
float y;
string z;
}
void main()
{
string s = format("%s", S());
writeln(s);
}
S(0, nan, "")
If that's good enough you can close with "WORKSFORME", thanks.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 18 2013









d-bugmail puremagic.com 