appender!(dchar[]) put fail

kerdemdemir via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jun 13 03:45:57 PDT 2015


I have two strings(stringB,stringC) which I need to repeat(bCount 
times, cCountTimes) and then chain.

auto charAppender = appender!(dchar[]);
auto totalStr = 
stringB.repeat(bCount).chain(stringC.repeat(cCount));

This compiles and works ok,
But when I try to append new string to charAppender :

charAppender.put(totalStr);	
Error: template std.array.join cannot deduce function from 
argument types

I tried:
charAppender.put(totalStr.array());
charAppender.data.chain(totalStr);
charAppender.data.chain(totalStr.array()); etc...

I always get compile errors.
Do you have any idea or fix about that?

Also what is the difference between algorithm.joiner without 
seperator and range.chain?

////////////////////////////////////////////////////////////////////////////
As requested before, this time I will copy full code,
////////////////////////////////////////////////////////////////////////////
int[dchar] mapA;
int includeCounter(T)(T tuple)
{
	int curMax = 100000;
	
	foreach ( elem ; tuple )	
	{
		int numberInA = 0;
		if (elem[0] in mapA)
			numberInA = mapA[elem[0]] ;
		else
		{
			curMax = 0;
			break;
		}
		
		if (  numberInA < elem[1] )
		{
			curMax = 0;
			break;
		}
		else
		{
			auto newCount = numberInA / elem[1];
			if ( newCount < curMax )
				curMax = newCount;
		}
	}
	if (curMax > 0)
	{
		foreach (  elem ; tuple )	
		{
			mapA[elem[0]] -= curMax;
		}
	}
	
	return curMax;	
}

void readInput()
{
	size_t lineSize;

	auto stringA = stdin.readln.chomp().map!( a => 
to!dchar(a)).array();
	auto stringB = stdin.readln.chomp().map!( a => 
to!dchar(a)).array();
	auto stringC = stdin.readln.chomp().map!( a => 
to!dchar(a)).array();
	
	foreach ( elem ; stringA)
		mapA[elem]++;
	
	auto tupleB = stringB.group();
	auto tupleC = stringC.group();

	auto bCount = includeCounter( tupleB );
	auto cCount = includeCounter( tupleC );

	auto charAppender = appender!(dchar[]);
	foreach ( elem ; mapA.keys)
	{
		int* count = &mapA[elem];
		if ( *count > 0)
		{
			while((*count)--)
				charAppender.put(elem) ;
		}
	}

	auto totalStr = 
stringB.repeat(bCount).chain(stringC.repeat(cCount));
	charAppender.put(totalStr);	
}

void main(  string[] args )
{
	readInput();
}


More information about the Digitalmars-d-learn mailing list