diff options
| -rw-r--r-- | slicer/slicer/modelPartsTypes.impl.h | 36 | 
1 files changed, 21 insertions, 15 deletions
diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index 5153b2e..0c1a92d 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -556,11 +556,14 @@ namespace Slicer {  	// ModelPartForEnum  	template<typename T> +	using EnumPair = std::pair<T, std::string>; + +	template<typename T>  	class ModelPartForEnum<T>::Enumerations : public boost::multi_index_container< -		std::pair<T, std::string>, +		EnumPair<T>,  		boost::multi_index::indexed_by< -			boost::multi_index::ordered_unique<boost::multi_index::member<std::pair<T, std::string>, const T, &std::pair<T, std::string>::first>>, -			boost::multi_index::ordered_unique<boost::multi_index::member<std::pair<T, std::string>, const std::string, &std::pair<T, std::string>::second>, std::less<>> +			boost::multi_index::ordered_unique<boost::multi_index::member<EnumPair<T>, const T, &EnumPair<T>::first>>, +			boost::multi_index::ordered_unique<boost::multi_index::member<EnumPair<T>, const std::string, &EnumPair<T>::second>, std::less<>>  			>> {  	}; @@ -576,26 +579,29 @@ namespace Slicer {  		return metadata;  	} +	template<int Side, typename Ex, typename ExP, typename T, typename V, typename R> +	inline const auto & ModelPartForEnumLookup(const typename ModelPartForEnum<T>::Enumerations & enumerations, +			const V & val, R EnumPair<T>::* rv) +	{ +		const auto & side = enumerations.template get<Side>(); +		if (auto i = side.find(val); i != side.end()) { +			return (*i).*rv; +		} +		throw Ex(ExP(val), typeid(T).name()); +	} +  	template<typename T>  	T ModelPartForEnum<T>::lookup(const std::string_view & val)  	{ -		auto & right = enumerations.template get<1>(); -		auto i = right.find(val); -		if (i == right.end()) { -			throw InvalidEnumerationSymbol(std::string(val), typeid(T).name()); -		} -		return i->first; +		return ModelPartForEnumLookup<1, InvalidEnumerationSymbol, std::string, T>(enumerations, val, +				&EnumPair<T>::first);  	}  	template<typename T>  	const std::string & ModelPartForEnum<T>::lookup(T val)  	{ -		auto & left = enumerations.template get<0>(); -		auto i = left.find(val); -		if (i == left.end()) { -			throw InvalidEnumerationValue((::Ice::Int)val, typeid(T).name()); -		} -		return i->second; +		return ModelPartForEnumLookup<0, InvalidEnumerationValue, ::Ice::Int, T>(enumerations, val, +				&EnumPair<T>::second);  	}  	template<typename T>  | 
