// TODO: Move to a separate .h template <typename T> static inline const T &min(const T &x, const T &y) { return x < y ? x : y; } template <typename T> static inline const T &max(const T &x, const T &y) { return x > y ? x : y; } static inline nsecs_t framesToNanoseconds(ssize_t frames, uint32_t sampleRate, float speed) { return ((double)frames * 1000000000) / ((double)sampleRate * speed); } static int64_t convertTimespecToUs(const struct timespec &tv) { return tv.tv_sec * 1000000LL + tv.tv_nsec / 1000; } // TODO move to audio_utils. static inline struct timespec convertNsToTimespec(int64_t ns) { struct timespec tv; tv.tv_sec = static_cast<time_t>(ns / NANOS_PER_SECOND); tv.tv_nsec = static_cast<int64_t>(ns % NANOS_PER_SECOND); return tv; } // current monotonic time in microseconds. static int64_t getNowUs() { struct timespec tv; (void) clock_gettime(CLOCK_MONOTONIC, &tv); return convertTimespecToUs(tv); }
时间: 2024-04-05 12:34:23 浏览: 74
这段代码看起来像是一些常用的工具函数,包括求最小值和最大值、将帧数转换为纳秒数、将 timespec 结构体转换为微秒数、将纳秒数转换为 timespec 结构体以及获取当前的单调时间戳。这些函数可能会在音频处理等方面使用。其中,对于获取当前单调时间戳的函数,它使用了 clock_gettime 函数,并传入了 CLOCK_MONOTONIC 参数,以获得相对于系统启动时间的单调时间戳。
相关问题
现在有这样的一个需求,写一个泛型类,泛型类包含 的数据类型包括QMap<QString,QVector<T>>t_map;QCache<QString,QVector<T>>t_cache;QVector<T>t_vctor;在泛型类中增加一个接口,比较不同的T,调用不同的泛型类的t的数据,思考一下,请用qt写一段代码,代码包含.h和.cpp。谢谢!
以下是我的代码实现:
```cpp
// mygenericclass.h
#ifndef MYGENERICCLASS_H
#define MYGENERICCLASS_H
#include <QMap>
#include <QCache>
#include <QVector>
template <typename T>
class MyGenericClass
{
public:
MyGenericClass();
void compareAndCall();
void addTToMap(const QString& key, const QVector<T>& value);
void addTToCache(const QString& key, const QVector<T>& value);
void addTToVector(const T& value);
private:
QMap<QString, QVector<T>> t_map;
QCache<QString, QVector<T>> t_cache;
QVector<T> t_vector;
};
template <typename T>
MyGenericClass<T>::MyGenericClass()
{
}
template <typename T>
void MyGenericClass<T>::compareAndCall()
{
// 比较不同的T,根据不同的T调用不同的泛型类的t的数据
if (std::is_same<T, QString>::value)
{
// 处理QString类型的数据
// TODO: add your code here
}
else if (std::is_same<T, int>::value)
{
// 处理int类型的数据
// TODO: add your code here
}
else if (std::is_same<T, double>::value)
{
// 处理double类型的数据
// TODO: add your code here
}
}
template <typename T>
void MyGenericClass<T>::addTToMap(const QString& key, const QVector<T>& value)
{
t_map.insert(key, value);
}
template <typename T>
void MyGenericClass<T>::addTToCache(const QString& key, const QVector<T>& value)
{
t_cache.insert(key, value);
}
template <typename T>
void MyGenericClass<T>::addTToVector(const T& value)
{
t_vector.append(value);
}
#endif // MYGENERICCLASS_H
```
```cpp
// mygenericclass.cpp
#include "mygenericclass.h"
// 暂无实现代码
```
在代码中,我定义了一个泛型类 MyGenericClass,它包含了三个数据结构:t_map、t_cache、t_vector,分别用于存储 QMap<QString, QVector<T>>、QCache<QString, QVector<T>>、QVector<T> 类型的数据。同时,我还定义了一个接口 compareAndCall,用于比较不同的 T 类型并调用不同的泛型类的 t 的数据。此外,我还定义了三个函数 addTToMap、addTToCache 和 addTToVector,用于向三个数据结构中添加数据。
在实际使用时,只需要在代码中实例化 MyGenericClass 并指定 T 的类型即可:
```cpp
MyGenericClass<QString> strClass;
MyGenericClass<int> intClass;
MyGenericClass<double> doubleClass;
```
然后,可以使用 addTToMap、addTToCache 和 addTToVector 函数向各自的数据结构中添加数据,最后调用 compareAndCall 函数比较不同的 T 类型并调用不同的泛型类的 t 的数据。
阅读全文