Feedback Wanted on Homegrown @nogc WriteLn Alternative

Kitt via Digitalmars-d digitalmars-d at puremagic.com
Fri Sep 26 16:55:58 PDT 2014


Large sections of my codebase require full control over when and 
how the GC is run. The new @nogc (as well as -vgc switch) has 
been amazingly helpful in developing safe code I can trust wont 
cause the GC to run; however, there are a few aspects of D I 
simply have to learn to work without in these cases. One good 
example is WriteLn and it's cousins. To this end, I'm writing my 
own @nogc version of WriteLn that uses the C printf and sprintf 
underneath.

I'm not a coding expert by any stretch of the imagination, and 
I'm even less of an expert when it comes to D; for this reason, I 
wanted to post my implementation and get some feedback from 
fellow D-velopers. I'm especially interested with adhering to 
"phobos quality" code as much as possible, so feel free to be 
very picky.




enum bool isScalarOrString(T) = isScalarType!T || isSomeString!T;

@nogc void Info(Types...)(Types arguments) if ( allSatisfy!( 
isScalarOrString, Types ) )
{
	const uint bufferSize = Types.length * 32;
	char[bufferSize] output;
	uint index;

	try
	{
		foreach(argument; arguments)
		{	
			static if(isIntegral!(typeof(argument))) {
				index += sprintf(&output[index], "%i", argument);
			}
			static if(isBoolean!(typeof(argument))) {
				if(argument) {
					index += sprintf(&output[index], "%s", cast(const 
char*)"true");
				}
				else {
					index += sprintf(&output[index], "%s", cast(const 
char*)"false");
				}
			}
			static if(isFloatingPoint!(typeof(argument))) {
				index += sprintf(&output[index], "%f", argument);
			}
			static if(isSomeChar!(typeof(argument))) {
				index += sprintf(&output[index], "%c", argument);
			}
			static if(isSomeString!(typeof(argument))) {
				index += sprintf(&output[index], "%.*s", argument.length, 
argument.ptr);
			}
		}
	}
	catch(Error e)
	{
		// TODO: Better Error Handling w/ more detail
		printf("%s", cast(const char*)"An Error has occured");
	}
	catch(Exception e)
	{
		// TODO: Better Exception handling w/ more detail
		printf("%s", cast(const char*)"An Exception has occured");
	}

}


More information about the Digitalmars-d mailing list