main.d(61): Error: temp_[i_] isn't mutable

Justin Spahr-Summers Justin.SpahrSummers at gmail.com
Sat Jun 19 12:14:59 PDT 2010


On Sat, 19 Jun 2010 17:30:26 +0000 (UTC), Ben Hanson 
<Ben.Hanson at tfbplc.co.uk> wrote:
> Here's the complete source:
> 
> module main;
> 
> import std.algorithm;
> import std.string;
> 
> template regex(StringT)
> {
> struct basic_string_token
> {
>     bool _negated = false;
> 	StringT _charset;
> 	typedef typeof(StringT.init[0]) CharT;
> 	enum size_t MAX_CHARS = CharT.max + 1;
> 
> 	this(const bool negated_, ref StringT charset_)
> 	{
> 		_negated = negated_;
> 		_charset = charset_;
> 	}
> 
> 	void remove_duplicates()
> 	{
> 		_charset.sort;
> 		_charset = squeeze(_charset);
> 	}
> 
> 	void normalise()
> 	{
> 		if (_charset.length == MAX_CHARS)
> 		{
>             _negated = !_negated;
> 			_charset.clear();
> 		}
> 		else if (_charset.length > MAX_CHARS / 2)
> 		{
> 			negate();
> 		}
> 	}
> 
> 	void negate()
> 	{
> 		CharT curr_char_ = MAX_CHARS == 256 ? 0x80 : 0;
> 		StringT temp_;
> 		size_t curr_ = 0;
> 		size_t end_ = _charset.length;
> 		size_t i_ = 0;
> 
>         _negated = !_negated;
> 		temp_.length = MAX_CHARS - end_;
> 
> 		while (curr_ < end_)
> 		{
> 			while (_charset[curr_] > curr_char_)
> 			{
> 				temp_[i_] = curr_char_;
> 				++curr_char_;
> 				++i_;
> 			}
> 
>             ++curr_char_;
>             ++curr_;
>             ++i_;
> 		}
> 
>         for (; i_ < MAX_CHARS; ++i_)
>         {
>             temp_ ~= curr_char_;
>             ++curr_char_;
>         }
> 
> 		_charset = temp_;
> 	}
> };
> }
> 
> int main(char[][]argv)
> {
> 	regex!(string).basic_string_token token_;
> 
> 	token_._charset = "cccbba";
> 	token_.remove_duplicates();
> 	token_.negate();
> 	return 0;
> }
> 
> Can anyone explain the error 'main.d(61): Error: temp_[i_] isn't
> mutable'? Can I use pointers instead like the C++ code? What's the
> best approach for maximum efficiency in D (pointers would make the
> conversion easier to, I guess).
> 
> Thanks,
> 
> Ben

"string" is actually an alias for "immutable(char)[]" (and similarly for 
the other string types), so its contents are not modifiable, though its 
length can be adjusted and contents appended. If you need to be able to 
modify the characters, just use char[] instead. You can then use the 
.idup property to get a string afterward.


More information about the Digitalmars-d mailing list