#ifndef PFOR_PFOR_LINEARDIOPHANTINEEQUATION_H #define PFOR_PFOR_LINEARDIOPHANTINEEQUATION_H #include "expression/operandtag.h" #include "index/property/linear.h" #include "index/traits.h" #include "mp/meta.h" #include "mp/pack.h" namespace pfor { /** */ template constexpr bool hasLinearDiophantineSolution = ((c % gcd(a, b)) == 0); template constexpr bool hasLinearDiophantineSolution<0, 0, c> = false; /** */ template struct NoLinearDiophantineSolution; template struct NoLinearDiophantineSolution: std::true_type {}; template struct NoLinearDiophantineSolution { static constexpr index::Value a = index::linearSlope; static constexpr index::Value b = -index::linearSlope; static constexpr index::Value c = index::linearOffset-index::linearOffset; static constexpr bool value = not hasLinearDiophantineSolution; }; template constexpr bool noLinearDiophantineSolution = NoLinearDiophantineSolution::value; /** */ template struct NoLinearDiophantineSolutionForVec; template struct NoLinearDiophantineSolutionForVec> { static constexpr bool value = noLinearDiophantineSolution && NoLinearDiophantineSolutionForVec>::value; }; template struct NoLinearDiophantineSolutionForVec>: std::true_type {}; template constexpr bool noLinearDiophantineSolutionForVec = NoLinearDiophantineSolutionForVec::value; /** */ template struct NoLinearDiophantineSolutionForGrid; template struct NoLinearDiophantineSolutionForGrid, P> { static constexpr bool value = noLinearDiophantineSolutionForVec && NoLinearDiophantineSolutionForGrid, P>::value; }; template struct NoLinearDiophantineSolutionForGrid, P>: std::true_type {}; template constexpr bool noLinearDiophantineSolutionForGrid = NoLinearDiophantineSolutionForGrid::value; } #endif