Program Listing for File mapping_utils.hpp

Return to documentation for file (include/uitsl/math/mapping_utils.hpp)

#pragma once
#ifndef UITSL_MATH_MAPPING_UTILS_HPP_INCLUDE
#define UITSL_MATH_MAPPING_UTILS_HPP_INCLUDE

#include <cmath>
#include <vector>

namespace uitsl {

using Point = std::vector<size_t>;
using Dims = std::vector<size_t>;

inline size_t linear_encode(const Point& p, const Dims& dims) {
  size_t mx = 1;
  size_t encoded = 0;
  for (size_t i = 0; i < dims.size(); ++i) {
    encoded += p[i] * mx;
    mx *= dims[i];
  }
  return encoded;
}

inline Point linear_decode(size_t r, const Dims& dims) {
  std::vector<size_t> decoded;
  for (size_t i = 0; i < dims.size(); ++i) {
    decoded.push_back(r % dims[i]);
    r /= dims[i];
  }
  return decoded;
}

// TODO: add a Hilbert curve variant

} // namespace uitsl

#endif // #ifndef UITSL_MATH_MAPPING_UTILS_HPP_INCLUDE