根据业务需求,在编码过程中,经常会遇到switch case表达式是字符串的场景,现支持如下。
【1】实现文件
支持实现的文件
1 #pragma once
2
3 #include <cstddef>
4 #include <cstdint>
5 #include <type_traits>
6
7 namespace prefab 8 { 9 template<typename T>
10 struct fnv1a_constant; 11
12 template<>
13 struct fnv1a_constant<std::uint32_t>
14 { 15 static constexpr std::uint32_t prime = 16777619; 16 static constexpr std::uint32_t offset = 2166136261; 17 }; 18
19 template<>
20 struct fnv1a_constant<std::uint64_t>
21 { 22 static constexpr std::uint64_t prime = 1099511628211ull; 23 static constexpr std::uint64_t offset = 14695981039346656037ull; 24 }; 25
26 template<typename T, typename TChar>
27 inline constexpr T fnv1a_hash(const TChar* const str, const T result = fnv1a_constant<T>::offset) 28 { 29 return (str[0] == '\0') ? result : 30 fnv1a_hash(str + 1, 31 static_cast<T>( 32 (result ^ *str)*
33 static_cast<unsigned long long>(fnv1a_constant<T>::prime))); 34 } 35
36 template<typename T, typename TChar>
37 inline constexpr T fnv1a_hash(std::size_t n, const TChar* const str, const T result = fnv1a_constant<T>::offset) 38 { 39 return n > 0 ? fnv1a_hash(n - 1, str + 1, (result ^ *str) * fnv1a_constant<T>::prime) : result; 40 } 41
42 template<typename T, typename TChar, std::size_t N>
43 inline constexpr T fnv1a_hash(const TChar(&str)[N]) 44 { 45 return fnv1a_hash<T>(N - 1, &str[0]); 46 } 47
48 template<typename TChar,std::size_t N>
49 inline constexpr auto hash(const TChar(&str)[N]) 50 { 51 return fnv1a_hash<std::size_t, TChar, N>(str); 52 } 53
54 template<typename T>
55 inline constexpr auto hash(T const& str) 56 { 57 return fnv1a_hash(str.size(), str.data(), fnv1a_constant<std::size_t>::offset); 58 } 59 }
【2】应用示例
1 #include "hash.hpp"
2
3 #include <string>
4 #include <iostream>
5
6 void print(int index, std::string value) 7 { 8 std::cout << index << " :: " << value << std::endl; 9 } 10
11 int main() 12 { 13 int index = 0; 14 for (std::string type : { "abc", "kaizen", "2805", "x64", "XIAN" }) 15 { 16 switch (prefab::hash(type)) 17 { 18 case prefab::hash("abc"): 19 print(index++, type); 20 break; 21 case prefab::hash("kaizen"): 22 print(index++, type); 23 break; 24 case prefab::hash("2805"): 25 print(index++, type); 26 break; 27 case prefab::hash("x64"): 28 print(index++, type); 29 break; 30 case prefab::hash("beijing"): 31 print(index++, type); 32 break; 33 default: 34 break; 35 } 36 } 37
38 return 0; 39 } 40
41 // result:
42 /*
43 0 :: abc 44 1 :: kaizen 45 2 :: 2805 46 3 :: x64 47 */
good good study, day day up.
顺序 选择 循环 总结