2023-07-04 14:10:13 +08:00

104 lines
1.8 KiB
C++

//
// Created by dongl on 23-5-17.
//
#ifndef IM2_TIMELINE_H
#define IM2_SAFEQUEUE_H
#include <string>
#include <queue>
#include "proto/mp.mp.pb.h"
#include "message_base/db_base.h"
struct SynMsg {
uint64_t message_id;
time_t time;
};
struct StorageMsg {
mp::MP_SUB_TYPE msg_type;
mp::MP_SUB_TYPE session_type;
int64_t message_id;
time_t time;
int64_t account;
std::string im_msg_data;
};
template<class T>
class SafeQueue {
public:
/**
* 压入元素
* @param ele T 类型的
*/
void push(T ele) {
mutex.lock();
queue.push(ele);
mutex.unlock();
}
/**
* 弹出元素 并 删除
* @return T
*/
T pull() {
std::lock_guard lockGuard(mutex);
auto ele = queue.front();
queue.pop();
return ele;
}
/**
* 头部元素
* @return T
*/
T front() {
std::lock_guard lockGuard(mutex);
return queue.front();
}
/**
* 查询第二个元素
* @return T
*/
T index_second() {
if (1 >= queue.size()) {
perror("查询越界\n");
return nullptr;
}
std::lock_guard lockGuard(mutex);
return *((&queue.front()) + 1);
}
/**
* 查询 距离 front 向右的第i个位置
* @param i 距离 front 向右的第i个位置
* @return T
*/
T index_second_n(uint32_t i) {
if (i >= queue.size()) {
perror("查询越界\n");
return nullptr;
}
std::lock_guard lockGuard(mutex);
return *((&queue.front()) + i);
}
/**
* 获取队列本身 not safe 的
* @return std::queue<T>
*/
std::queue<T>& value() {
return queue;
}
private:
std::mutex mutex;
std::queue<T> queue;
};
#endif //IM2_TIMELINE_H