www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Need help how to get started with D ranges

reply "Uranuz" <neuranuz gmail.com> writes:
I see that ranges is primitive to organzie universal approach to 
write some algorithms. But I'm using algorithms from the library 
but I still can't start with writing my own algorithms based on 
ranges. For example I have the following function written without 
ranges. I want to improve it and make it working with different 
types of strings (char[], string, wchar[], etc...). So could 
someone give me an example how to rewrite this function in 
`range`-style?

//Parses HTML form data
dstring[dstring] parseFormData2(dstring queryStr)
{	size_t LexStart = 0;
	dstring curKey;
	dstring curValue;
	for( size_t i = 0; i < queryStr.length; ++i )
	{	if( queryStr[i] == '=' )
		{	curKey = queryStr[LexStart..i].idup;
			curValue = null;
			LexStart = i+1;
		}
		if( (queryStr[i] == '&') || (i+1 == queryStr.length) )
		{	curValue = queryStr[ LexStart .. (i+1 == queryStr.length) ? 
++i : i ].idup;
			if( curKey.length > 0)
			{	result[curKey] = curValue;
				//result[curKey] ~= curValue;
			}
			curKey = null;
			LexStart = i+1;
		}
	}
	return result;
}
Mar 24 2014
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Monday, 24 March 2014 at 12:13:43 UTC, Uranuz wrote:
 I see that ranges is primitive to organzie universal approach 
 to write some algorithms. But I'm using algorithms from the 
 library but I still can't start with writing my own algorithms 
 based on ranges. For example I have the following function 
 written without ranges. I want to improve it and make it 
 working with different types of strings (char[], string, 
 wchar[], etc...). So could someone give me an example how to 
 rewrite this function in `range`-style?

 //Parses HTML form data
 dstring[dstring] parseFormData2(dstring queryStr)
 {	size_t LexStart = 0;
 	dstring curKey;
 	dstring curValue;
 	for( size_t i = 0; i < queryStr.length; ++i )
 	{	if( queryStr[i] == '=' )
 		{	curKey = queryStr[LexStart..i].idup;
 			curValue = null;
 			LexStart = i+1;
 		}
 		if( (queryStr[i] == '&') || (i+1 == queryStr.length) )
 		{	curValue = queryStr[ LexStart .. (i+1 == queryStr.length) ? 
 ++i : i ].idup;
 			if( curKey.length > 0)
 			{	result[curKey] = curValue;
 				//result[curKey] ~= curValue;
 			}
 			curKey = null;
 			LexStart = i+1;
 		}
 	}
 	return result;
 }
Have you read this: http://ddili.org/ders/d.en/ranges.html ?
Mar 24 2014
parent reply "Uranuz" <neuranuz gmail.com> writes:
 Have you read this: http://ddili.org/ders/d.en/ranges.html ?
Yes I have read it. It's difficult to formulate the question in English bu I'l try. In this example I searching for special symbols '&' and '='. So when symbol found I use *save* method of range to remember start of *name* or *value* string of URL encoded param. Then I trying to find next special symbol. And when I found it I need to take a slice and insert in result AA. Should input range be RandomAccess for it? And if it's not random access range should should I append this substring by symbol to some temp variable and then (when delimiter found) insert into Associative Array. So result is that I will implement two different behaviours for InputRange and for RandomAccessRange. Am I right or not?
Mar 24 2014
next sibling parent "Uranuz" <neuranuz gmail.com> writes:
I have another question. For example I have some range with input 
data (for example some array). I using method popFront() to 
iterate to next element. Then with property front I check element 
if it has some value. Then I *save* it. But how could I get 
position of this derived range in original range without 
overhead. As I see it is only possible via additional variable 
that will keep this position. In this case I can't understand 
what is the benefit of range over iterators or simply iterating 
using some integral index. I should admit that I haven't used 
iterators a lot in C++ so I don't know all of it's possibilities/ 
advantages. It's why I asking.

In my algorithms for parsing some strings I often save positions 
of beginings of some tokens in order to take a slice and put it 
into some buffer. But for opearting with them in terms of ranges 
I need to have RandomAccessRange, because (as far as I 
understand) only it have ability to take a slice. But with input 
I will need to operate (save parsed data) element-wise. And this 
will realocate and slow execution. What is preferable startegy 
opearating with ranges that will be flexible and productive?
Mar 24 2014
prev sibling parent "monarch_dodra" <monarchdodra gmail.com> writes:
On Monday, 24 March 2014 at 14:12:58 UTC, Uranuz wrote:
 Have you read this: http://ddili.org/ders/d.en/ranges.html ?
Yes I have read it. It's difficult to formulate the question in English bu I'l try. In this example I searching for special symbols '&' and '='. So when symbol found I use *save* method of range to remember start of *name* or *value* string of URL encoded param. Then I trying to find next special symbol. And when I found it I need to take a slice and insert in result AA. Should input range be RandomAccess for it? And if it's not random access range should should I append this substring by symbol to some temp variable and then (when delimiter found) insert into Associative Array. So result is that I will implement two different behaviours for InputRange and for RandomAccessRange. Am I right or not?
If you want to be able to *slice*, then you need an `RandomAccessRange` with `hasSlicing`. a RandomAccessRange is a special kind of ForwardRange, which itself is an Input Range.
Mar 24 2014