104 lines
1.8 KiB
C++
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
|