template <typename T> \
friend IntegralType<T, range<dimensions>> operator op( \
const range<dimensions> &lhs, const T &rhs) { \
range<dimensions> result(lhs); \
for (int i = 0; i < dimensions; ++i) { \
result.common_array[i] = lhs.common_array[i] op rhs; \
} \
return result; \
} \
template <typename T> \
friend IntegralType<T, range<dimensions>> operator op( \
const T &lhs, const range<dimensions> &rhs) { \
range<dimensions> result(rhs); \
for (int i = 0; i < dimensions; ++i) { \
result.common_array[i] = lhs op rhs.common_array[i]; \
} \
return result; \
}