• string_switch_case


    #pragma once
    // ----------------------------------------------------------------------------
    // string_switch_case.h
    //
    // These macros together implement switch-case functionality for C strings and
    // std::string.  When first encountered, the switch-case structure does two
    // passes.  The first pass is a one-time initialization of a std::map with the
    // strings as keys, and line numbers as values, to get the unique keys needed 
    // for a numeric switch-case.  All subsequent passes use the std::map to
    // retrieve an unsigned integer for a given string, that was mapped during the
    // first pass, to use for a numeric switch case.  This switch-case approach can
    // be used repeatedly and even nested.  An example of the usage is as follows:
    //
    // switch_string(a)
    // {
    // case_string("first string")
    //    printf("first string");
    //    break;
    // case_string("second string")
    //    printf("second string");
    // case_string("third string")
    //    printf("falls through to third string");
    //    break;
    // default_case_string
    //    printf("default");
    // }
    // end_switch_string
    //
    // The end_switch_string macro is required after the closing brace of the
    // switch-case structure.  Each case_string statement must be on a unique line.
    // Each case_string has its own local scope.  A case_string statement is
    // ignored if declared within scope brackets beneath a sibling case statement.
    // ----------------------------------------------------------------------------
    
    #include <map>
    #include <string>
    
    
    // switch macro
    #define switch_string(a) while (true) { 	static std::map<std::string, unsigned int> _string_lookup_; 	static bool _init_ = true; 	unsigned int _val_ = 0; 	if (!_init_) { 		std::map<std::string, unsigned int>::iterator _iter_ = 			_string_lookup_.find(a); 			if (_iter_ != _string_lookup_.end()) { 				_val_ = (*_iter_).second; } 			else { 				_val_ = 0xffffffff; 			} 	} 	switch(_val_) { 	case 0:
    
    
    // case macro
    #define case_string(a) 		} 	case __LINE__: 		if (_init_) 			_string_lookup_.insert 				(std::pair<std::string, unsigned int>(a, __LINE__)); 		else {
    
    
    // default case macro
    #define default_case_string 		} 	default: 		if (!_init_) {
    
    
    // required macro for the end of the switch-case
    #define end_switch_string 	} 	if (_init_) { 		_init_ = false; 	} 	else { 		break; 	} }

  • 相关阅读:
    5.9上午
    5.4下午
    5.4上午
    5.2上午
    4.19下午
    4.18上午
    4.17下午
    4.17上午
    4.12下午
    4.13下午
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318519.html
Copyright © 2020-2023  润新知