Use template specialisation
authorEddie Hung <eddie@fpgeh.com>
Fri, 13 Sep 2019 18:13:57 +0000 (11:13 -0700)
committerEddie Hung <eddie@fpgeh.com>
Fri, 13 Sep 2019 18:13:57 +0000 (11:13 -0700)
kernel/sigtools.h

index 2f2d3f5c6dd420f8f5a7543a20d1ad7cd4e6a415..8c0434ceb7aa1e2f5ce71e30c58d3a8f3a083976 100644 (file)
@@ -135,10 +135,10 @@ struct SigPool
        }
 };
 
-template <typename T, class Compare = std::less<T>>
+template <typename T, class Compare=void>
 struct SigSet
 {
-       static_assert(!std::is_pointer<T>::value || !std::is_same<Compare, std::less<T>>::value, "Explicit `Compare' class required for SigSet with pointer-type values!");
+       static_assert(!std::is_same<Compare,void>::value, "Default value for `Compare' class not found for SigSet<T>. Please specify.");
 
        struct bitDef_t : public std::pair<RTLIL::Wire*, int> {
                bitDef_t() : std::pair<RTLIL::Wire*, int>(NULL, 0) { }
@@ -222,6 +222,13 @@ struct SigSet
        }
 };
 
+template<typename T>
+class SigSet<T, typename std::enable_if<!std::is_pointer<T>::value>::type> : public SigSet<T, std::less<T>> {};
+template<typename T>
+using sort_by_name_id_guard = typename std::enable_if<std::is_same<T,RTLIL::Cell*>::value>::type;
+template<typename T>
+class SigSet<T, sort_by_name_id_guard<T>> : public SigSet<T, RTLIL::sort_by_name_id<typename std::remove_pointer<T>::type>> {};
+
 struct SigMap
 {
        mfp<SigBit> database;