Listing 2: Template policy class.

// just a placeholder
template <typename T>
struct IntelIppPolicy {
    typedef T elem_type;
};
// specialization for float type
template<>
struct IntelIppPolicy<Ipp32f> {
    // 'traits'
    typedef Ipp32f elem_type;
    static Ipp32f *malloc(int len) { return ippsMalloc_32f(len); }
    static void free(void *ptr) { return ippsFree(ptr); }
    static IppStatus maxIndx(const Ipp32f *pSrc, int len, Ipp32f *pMax, int *pIndx) { 
        return ippsMaxIndx_32f(pSrc, len, pMax, pIndx); 
    }
   static IppStatus minIndx(const Ipp32f *pSrc, int len, Ipp32f *pMin, int *pIndx) { 
        return ippsMinIndx_32f(pSrc, len, pMin, pIndx); 
    }
};
// specialization for double type
template<>
struct IntelIppPolicy<Ipp64f> {
    // 'traits'
    typedef Ipp64f elem_type;
    static Ipp64f *malloc(int len) { return ippsMalloc_64f(len); }
    static void free(void *ptr) { return ippsFree(ptr); }
    static IppStatus maxIndx(const Ipp64f *pSrc, int len, Ipp64f *pMax, int *pIndx) { 
        return ippsMaxIndx_64f(pSrc, len, pMax, pIndx); 
    }
    static IppStatus minIndx(const Ipp64f *pSrc, int len, Ipp64f *pMin, int *pIndx) { 
        return ippsMinIndx_64f(pSrc, len, pMin, pIndx); 
    }
};