digitalmars.D.bugs - [Issue 5236] New: [patch] std.format.formattedRead/unformatValue does not support the raw reading of integer types
- d-bugmail puremagic.com (76/76) Nov 18 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5236
- d-bugmail puremagic.com (11/11) Nov 18 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5236
- d-bugmail puremagic.com (10/10) Jan 09 2011 http://d.puremagic.com/issues/show_bug.cgi?id=5236
http://d.puremagic.com/issues/show_bug.cgi?id=5236 Summary: [patch] std.format.formattedRead/unformatValue does not support the raw reading of integer types Product: D Version: D2 Platform: Other OS/Version: Windows Status: NEW Keywords: patch Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: sandford jhu.edu The raw value reading code was never duplicated in the isIntegral version of unformatValue. Given the amount of code overlap for raw value reading, I'd recommend a re-factor of the unformatValue, but in the mean time, here is a patch and unit test. Unit test: union B { char[int.sizeof] untyped; int typed; }; B b; b.typed = 5; char[] input = b.untyped[]; int witness; formattedRead(input, "%r", &witness); assert(witness == b.typed); Patch: /** Reads an integral value and returns it. */ T unformatValue(T, Range, Char)(ref Range input, ref FormatSpec!Char spec) if (isIntegral!T && isInputRange!Range) { if (spec.spec == 'r') { // raw read //enforce(input.length >= T.sizeof); enforce(isSomeString!Range || ElementType!(Range).sizeof == 1); union X { ubyte[T.sizeof] raw; T typed; } X x; foreach (i; 0 .. T.sizeof) { static if (isSomeString!Range) { x.raw[i] = input[0]; input = input[1 .. $]; } else { // TODO: recheck this x.raw[i] = cast(ubyte) input.front; input.popFront(); } } return x.typed; } enforce(std.algorithm.find("cdosuxX", spec.spec).length, text("Wrong integral type specifier: `", spec.spec, "'")); if (std.algorithm.find("dsu", spec.spec).length) { return parse!T(input); } assert(0, "Parsing spec '"~spec.spec~"' not implemented."); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 18 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5236 Also, the unformatValue routines need to wrap the parse statements in a traits compiles test, in order to support raw reading from byte streams. i.e. static if(__traits(compiles, parse!T(input) )) { return parse!T(input); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 18 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5236 Andrei Alexandrescu <andrei metalanguage.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED CC| |andrei metalanguage.com AssignedTo|nobody puremagic.com |andrei metalanguage.com -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jan 09 2011