www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Get index of string in array at compile time

reply "tcak" <tcak gmail.com> writes:
I have define an immutable string array:

[code]
immutable string[] placeHolderDefinitionList = [
	"<!-- fullname -->",
	"<!-- list item -->"
];
[/code]

I need to get index of a string at compile time. So I have 
written a function as below:

[code]
public size_t getPlaceholderIndex(string PlaceHolderText)( size_t 
lookIndex = 0 ){
	static if( lookIndex >= placeHolderDefinitionList.length )
		return size_t.max;

	static if( placeHolderDefinitionList[lookIndex] == 
PlaceHolderText )
		return lookIndex;
	else
		return getPlaceholderIndex( lookIndex + 1 );
}
[/code]

Called it as below:

[code]
writeln( "Index: ", getPlaceholderIndex!"<!-- list item -->"( 0 ) 
);
[/code]

Compiler didn't like my code. It said those things to my face:

main.d(22): Error: variable lookIndex cannot be read at compile 
time
main.d(25): Error: variable lookIndex cannot be read at compile 
time
main.d(28): Error: template main.getPlaceholderIndex cannot 
deduce function from argument types !()(ulong), candidates are:
main.d(21):        main.getPlaceholderIndex(string 
PlaceHolderText)(size_t lookIndex = 0)
main.d(105): Error: template instance 
main.getPlaceholderIndex!"<!-- list item -->" error instantiating

This is my first try with this type of code. So I am confused a 
little about what I should be doing.
May 29 2015
parent Timon Gehr <timon.gehr gmx.ch> writes:
On 05/29/2015 06:43 PM, tcak wrote:
 I have define an immutable string array:

 [code]
 immutable string[] placeHolderDefinitionList = [
      "<!-- fullname -->",
      "<!-- list item -->"
 ];
 [/code]

 I need to get index of a string at compile time. So I have written a
 function as below:

 [code]
 public size_t getPlaceholderIndex(string PlaceHolderText)( size_t
 lookIndex = 0 ){
      static if( lookIndex >= placeHolderDefinitionList.length )
          return size_t.max;

      static if( placeHolderDefinitionList[lookIndex] == PlaceHolderText )
          return lookIndex;
      else
          return getPlaceholderIndex( lookIndex + 1 );
 }
 [/code]

 Called it as below:

 [code]
 writeln( "Index: ", getPlaceholderIndex!"<!-- list item -->"( 0 ) );
 [/code]

 Compiler didn't like my code. It said those things to my face:

 main.d(22): Error: variable lookIndex cannot be read at compile time
 main.d(25): Error: variable lookIndex cannot be read at compile time
 main.d(28): Error: template main.getPlaceholderIndex cannot deduce
 function from argument types !()(ulong), candidates are:
 main.d(21):        main.getPlaceholderIndex(string
 PlaceHolderText)(size_t lookIndex = 0)
 main.d(105): Error: template instance main.getPlaceholderIndex!"<!--
 list item -->" error instantiating

 This is my first try with this type of code. So I am confused a little
 about what I should be doing.
The easiest way is to just write runtime code and evaluate it via CTFE: immutable string[] placeHolderDefinitionList = [ "<!-- fullname -->", "<!-- list item -->" ]; void main(){ import std.stdio, std.algorithm; enum index=placeHolderDefinitionList.countUntil("<!-- list item -->"); writeln("Index: ", index); } If you never need the placeHolderDefinitionList at runtime, make it enum instead of immutable.
May 29 2015