libcamera: utils: Add alignUp and alignDown functions

Add to libcamera utils library two functions to round up or down a
value to an alignment and add a test in test/utils.cpp for the two
new functions.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Jacopo Mondi 2020-07-13 15:05:23 +02:00
parent 4383252d93
commit d405d1fd5e
3 changed files with 37 additions and 0 deletions

View file

@ -200,6 +200,16 @@ details::StringSplitter split(const std::string &str, const std::string &delim);
std::string libcameraBuildPath();
std::string libcameraSourcePath();
constexpr unsigned int alignDown(unsigned int value, unsigned int alignment)
{
return value / alignment * alignment;
}
constexpr unsigned int alignUp(unsigned int value, unsigned int alignment)
{
return (value + alignment - 1) / alignment * alignment;
}
} /* namespace utils */
} /* namespace libcamera */

View file

@ -444,6 +444,22 @@ std::string libcameraSourcePath()
return path + "/";
}
/**
* \fn alignDown(unsigned int value, unsigned int alignment)
* \brief Align \a value down to \a alignment
* \param[in] value The value to align
* \param[in] alignment The alignment
* \return The value rounded down to the nearest multiple of \a alignment
*/
/**
* \fn alignUp(unsigned int value, unsigned int alignment)
* \brief Align \a value up to \a alignment
* \param[in] value The value to align
* \param[in] alignment The alignment
* \return The value rounded up to the nearest multiple of \a alignment
*/
} /* namespace utils */
} /* namespace libcamera */

View file

@ -166,6 +166,17 @@ protected:
return TestFail;
}
/* utils::alignUp() and utils::alignDown() tests. */
if (utils::alignDown(6, 3) != 6 || utils::alignDown(7, 3) != 6) {
cerr << "utils::alignDown test failed" << endl;
return TestFail;
}
if (utils::alignUp(6, 3) != 6 || utils::alignUp(7, 3) != 9) {
cerr << "utils::alignUp test failed" << endl;
return TestFail;
}
return TestPass;
}
};