mirror of
https://github.com/transmission/transmission.git
synced 2026-02-15 07:26:49 +00:00
145 lines
4.0 KiB
C++
145 lines
4.0 KiB
C++
// This file Copyright © Mnemosyne LLC.
|
|
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
|
// or any future license endorsed by Mnemosyne LLC.
|
|
// License text can be found in the licenses/ folder.
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint> // uint8_t, uint32_t, uint64_t
|
|
#include <ctime> // time_t
|
|
#include <locale>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <type_traits>
|
|
#include <vector>
|
|
|
|
/**
|
|
* @addtogroup utils Utilities
|
|
* @{
|
|
*/
|
|
|
|
std::optional<std::locale> tr_locale_set_global(char const* locale_name) noexcept;
|
|
|
|
std::optional<std::locale> tr_locale_set_global(std::locale const& locale) noexcept;
|
|
|
|
// ---
|
|
|
|
[[nodiscard]] std::string_view tr_get_mime_type_for_filename(std::string_view filename);
|
|
|
|
/** @brief return the current date in milliseconds */
|
|
[[nodiscard]] uint64_t tr_time_msec();
|
|
|
|
#ifdef _WIN32
|
|
|
|
int tr_main_win32(int argc, char** argv, int (*real_main)(int, char**));
|
|
|
|
#define tr_main(...) \
|
|
main_impl(__VA_ARGS__); \
|
|
int main(int argc, char* argv[]) \
|
|
{ \
|
|
return tr_main_win32(argc, argv, &main_impl); \
|
|
} \
|
|
int main_impl(__VA_ARGS__)
|
|
|
|
#else
|
|
|
|
#define tr_main main
|
|
|
|
#endif
|
|
|
|
// ---
|
|
|
|
template<typename T>
|
|
[[nodiscard]] constexpr int tr_compare_3way(T const& left, T const& right)
|
|
{
|
|
if (left < right)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (right < left)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ---
|
|
|
|
/**
|
|
* @brief Given a string like "1-4" or "1-4,6,9,14-51", this returns a
|
|
* newly-allocated array of all the integers in the set.
|
|
* @return a vector of integers, which is empty if the string can't be parsed.
|
|
*
|
|
* For example, "5-8" will return [ 5, 6, 7, 8 ] and setmeCount will be 4.
|
|
*/
|
|
[[nodiscard]] std::vector<int> tr_num_parse_range(std::string_view str);
|
|
|
|
/**
|
|
* @brief truncate a double value at a given number of decimal places.
|
|
*
|
|
* this can be used to prevent a `printf()` call from rounding up:
|
|
* call with the `decimal_places` argument equal to the number of
|
|
* decimal places in the `printf()`'s precision:
|
|
*
|
|
* - printf("%.2f%%", 99.999) ==> "100.00%"
|
|
*
|
|
* - printf("%.2f%%", tr_truncd(99.999, 2)) ==> "99.99%"
|
|
* ^ ^
|
|
* | These should match |
|
|
* +------------------------+
|
|
*/
|
|
[[nodiscard]] double tr_truncd(double x, int decimal_places);
|
|
|
|
/* return a percent formatted string of either x.xx, xx.x or xxx */
|
|
[[nodiscard]] std::string tr_strpercent(double x);
|
|
|
|
/** @brief return `TR_RATIO_NA`, `TR_RATIO_INF`, or a number in [0..1]
|
|
@return `TR_RATIO_NA`, `TR_RATIO_INF`, or a number in [0..1] */
|
|
[[nodiscard]] double tr_getRatio(uint64_t numerator, uint64_t denominator);
|
|
|
|
/** @param ratio the ratio to convert to a string
|
|
@param infinity the string representation of "infinity" */
|
|
[[nodiscard]] std::string tr_strratio(double ratio, std::string_view none, std::string_view infinity);
|
|
|
|
// ---
|
|
|
|
namespace tr::detail::tr_time
|
|
{
|
|
extern time_t current_time;
|
|
}
|
|
|
|
/**
|
|
* @brief very inexpensive form of time(nullptr)
|
|
* @return the current epoch time in seconds
|
|
*
|
|
* This function returns a second counter that is updated once per second.
|
|
* If something blocks the libtransmission thread for more than a second,
|
|
* that counter may be thrown off, so this function is not guaranteed
|
|
* to always be accurate. However, it is *much* faster when 100% accuracy
|
|
* isn't needed
|
|
*/
|
|
[[nodiscard]] static inline time_t tr_time() noexcept
|
|
{
|
|
return tr::detail::tr_time::current_time;
|
|
}
|
|
|
|
/** @brief Private libtransmission function to update `tr_time()`'s counter */
|
|
constexpr void tr_timeUpdate(time_t now) noexcept
|
|
{
|
|
tr::detail::tr_time::current_time = now;
|
|
}
|
|
|
|
/** @brief Portability wrapper for `htonll()` that uses the system implementation if available */
|
|
[[nodiscard]] uint64_t tr_htonll(uint64_t hostlonglong);
|
|
|
|
/** @brief Portability wrapper for `ntohll()` that uses the system implementation if available */
|
|
[[nodiscard]] uint64_t tr_ntohll(uint64_t netlonglong);
|
|
|
|
// ---
|
|
|
|
/** @brief Initialise libtransmission for each app */
|
|
void tr_lib_init();
|