www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Can I check if a value is convertible to a valid value of an enum?

reply French Football <ff gmrle.com> writes:
...without having to loop over the enum?

enum SomeType : string { CHEESE = "cheese", POTATO = "potato" }
string valid_value = "cheese";
string invalid_value = "pizza";

bool test( string value ){
     if( value.isConvertableToSomeType ){ // this be the magic I 
seek
         //do something
         return true;
     }
     return false;
}

void main(){
     writeln( test( valid_value ) ); //prints true
     writeln( test( invalid_value ) ); //prints false
}

Or would I need to foreach over the enum somehow?
Sep 24 2015
next sibling parent thedeemon <dlang thedeemon.com> writes:
On Friday, 25 September 2015 at 03:12:20 UTC, French Football 
wrote:
 ...without having to loop over the enum?
     writeln( test( valid_value ) ); //prints true
Since `value` is known only at run time, some checks need to be performed at run time anyway. One way of doing it without iterating over all variants is to create a static hash table bool[string] valid_strings; and populate it in static constructor, then in your function you can just write if (value in valid_strings) ...
Sep 24 2015
prev sibling parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Friday, 25 September 2015 at 03:12:20 UTC, French Football 
wrote:
 ...without having to loop over the enum?

 enum SomeType : string { CHEESE = "cheese", POTATO = "potato" }
 string valid_value = "cheese";
 string invalid_value = "pizza";

 bool test( string value ){
     if( value.isConvertableToSomeType ){ // this be the magic I 
 seek
         //do something
         return true;
     }
     return false;
 }

 void main(){
     writeln( test( valid_value ) ); //prints true
     writeln( test( invalid_value ) ); //prints false
 }

 Or would I need to foreach over the enum somehow?
find + EnumMembers should do the trick if ( (EnumMembers!SomeType).canFind(value)) { // ... }
Sep 24 2015
parent Meta <jared771 gmail.com> writes:
On Friday, 25 September 2015 at 03:20:24 UTC, Nicholas Wilson 
wrote:
 find + EnumMembers should do the trick
 if ( (EnumMembers!SomeType).canFind(value))
 {
     // ...
 }
Should be if (only(EnumMembers!SomeType).canFind(value)) { //... }
Sep 25 2015