#pragma once #include #include #include #include #include #include #include #include namespace c10 { using SymIntArrayRef = ArrayRef; inline at::IntArrayRef asIntArrayRefUnchecked(c10::SymIntArrayRef ar) { return IntArrayRef(reinterpret_cast(ar.data()), ar.size()); } inline c10::optional asIntArrayRefSlowOpt( c10::SymIntArrayRef ar) { for (const c10::SymInt& sci : ar) { if (sci.is_symbolic()) { return c10::nullopt; } } return {asIntArrayRefUnchecked(ar)}; } inline at::IntArrayRef asIntArrayRefSlow( c10::SymIntArrayRef ar, const char* file, int64_t line) { for (const c10::SymInt& sci : ar) { TORCH_CHECK( !sci.is_symbolic(), file, ":", line, ": SymIntArrayRef expected to contain only concrete integers"); } return asIntArrayRefUnchecked(ar); } #define C10_AS_INTARRAYREF_SLOW(a) c10::asIntArrayRefSlow(a, __FILE__, __LINE__) // Prefer using a more semantic constructor, like // fromIntArrayRefKnownNonNegative inline SymIntArrayRef fromIntArrayRefUnchecked(IntArrayRef array_ref) { return SymIntArrayRef( reinterpret_cast(array_ref.data()), array_ref.size()); } inline SymIntArrayRef fromIntArrayRefKnownNonNegative(IntArrayRef array_ref) { return fromIntArrayRefUnchecked(array_ref); } inline SymIntArrayRef fromIntArrayRefSlow(IntArrayRef array_ref) { for (size_t i = 0; i < array_ref.size(); ++i) { TORCH_CHECK( SymInt::check_range(array_ref[i]), "IntArrayRef contains an int that cannot be represented as a SymInt: ", array_ref[i]); } return SymIntArrayRef( reinterpret_cast(array_ref.data()), array_ref.size()); } } // namespace c10