qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
chatlinestorage.h
Go to the documentation of this file.
1 /*
2  Copyright © 2021 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #pragma once
21 
22 #include "src/chatlog/chatline.h"
23 #include "src/model/ichatlog.h"
24 
25 #include <QDateTime>
26 
27 #include <vector>
28 #include <map>
29 
54 {
55 
56  struct IdxInfo
57  {
58  size_t linePos;
59  QDateTime timestamp;
60  };
61  using Lines_t = std::vector<ChatLine::Ptr>;
62  using DateLineMap_t = std::map<ChatLine::Ptr, QDateTime>;
63  using IdxInfoMap_t = std::map<ChatLogIdx, IdxInfo>;
64 
65 public:
66  // Types to conform with other containers
67  using size_type = Lines_t::size_type;
68  using reference = Lines_t::reference;
69  using const_reference = Lines_t::const_reference;
70  using const_iterator = Lines_t::const_iterator;
71  using iterator = Lines_t::iterator;
72 
73 
74 public:
75  iterator insertChatMessage(ChatLogIdx idx, QDateTime timestamp, ChatLine::Ptr line);
76  iterator insertDateLine(QDateTime timestamp, ChatLine::Ptr line);
77 
78  ChatLogIdx firstIdx() const { return idxInfoMap.begin()->first; }
79 
80  ChatLogIdx lastIdx() const { return idxInfoMap.rbegin()->first; }
81 
82  bool contains(ChatLogIdx idx) const { return idxInfoMap.find(idx) != idxInfoMap.end(); }
83 
84  bool contains(QDateTime timestamp) const;
85 
88 
89  const_reference operator[](size_type idx) const { return lines[idx]; }
90 
91  const_reference operator[](ChatLogIdx idx) const { return lines[idxInfoMap.at(idx).linePos]; }
92 
93  size_type size() const { return lines.size(); }
94 
95  iterator begin() { return lines.begin(); }
96  iterator end() { return lines.end(); }
97 
98  bool empty() const { return lines.empty(); }
99 
100  bool hasIndexedMessage() const { return !idxInfoMap.empty(); }
101 
102  void clear()
103  {
104  idxInfoMap.clear();
105  dateMap.clear();
106  return lines.clear();
107  }
108 
109  reference front() { return lines.front(); }
110  reference back() { return lines.back(); }
111 
112  void erase(ChatLogIdx idx);
113  iterator erase(iterator it);
114 
115 private:
116  iterator equivalentLineIterator(IdxInfoMap_t::iterator it);
117 
118  IdxInfoMap_t::iterator equivalentInfoIterator(iterator it);
119 
120  IdxInfoMap_t::iterator infoIteratorForIdx(ChatLogIdx idx);
121 
122  iterator adjustItForDate(iterator it, QDateTime timestamp);
123 
124  void incrementLinePosAfter(IdxInfoMap_t::iterator it);
125  void decrementLinePosAfter(IdxInfoMap_t::iterator it);
126  bool shouldRemovePreviousLine(iterator prevIt, iterator it);
127 
128  std::vector<ChatLine::Ptr> lines;
129  std::map<ChatLine::Ptr, QDateTime> dateMap;
131 };
ChatLineStorage
Definition: chatlinestorage.h:53
ChatLineStorage::adjustItForDate
iterator adjustItForDate(iterator it, QDateTime timestamp)
Definition: chatlinestorage.cpp:177
ChatLineStorage::decrementLinePosAfter
void decrementLinePosAfter(IdxInfoMap_t::iterator it)
Definition: chatlinestorage.cpp:206
ichatlog.h
ChatLineStorage::IdxInfo
Definition: chatlinestorage.h:56
ChatLineStorage::reference
Lines_t::reference reference
Definition: chatlinestorage.h:68
ChatLineStorage::insertChatMessage
iterator insertChatMessage(ChatLogIdx idx, QDateTime timestamp, ChatLine::Ptr line)
Definition: chatlinestorage.cpp:24
ChatLineStorage::insertDateLine
iterator insertDateLine(QDateTime timestamp, ChatLine::Ptr line)
Definition: chatlinestorage.cpp:50
ChatLineStorage::hasIndexedMessage
bool hasIndexedMessage() const
Definition: chatlinestorage.h:100
ChatLineStorage::shouldRemovePreviousLine
bool shouldRemovePreviousLine(iterator prevIt, iterator it)
Definition: chatlinestorage.cpp:214
ChatLineStorage::operator[]
const_reference operator[](ChatLogIdx idx) const
Definition: chatlinestorage.h:91
ChatLineStorage::empty
bool empty() const
Definition: chatlinestorage.h:98
ChatLineStorage::const_reference
Lines_t::const_reference const_reference
Definition: chatlinestorage.h:69
ChatLineStorage::const_iterator
Lines_t::const_iterator const_iterator
Definition: chatlinestorage.h:70
chatline.h
ChatLineStorage::find
iterator find(ChatLogIdx idx)
Definition: chatlinestorage.cpp:88
ChatLineStorage::begin
iterator begin()
Definition: chatlinestorage.h:95
ChatLineStorage::equivalentLineIterator
iterator equivalentLineIterator(IdxInfoMap_t::iterator it)
Definition: chatlinestorage.cpp:143
ChatLineStorage::operator[]
const_reference operator[](size_type idx) const
Definition: chatlinestorage.h:89
ChatLineStorage::size
size_type size() const
Definition: chatlinestorage.h:93
ChatLineStorage::firstIdx
ChatLogIdx firstIdx() const
Definition: chatlinestorage.h:78
ChatLineStorage::IdxInfo::timestamp
QDateTime timestamp
Definition: chatlinestorage.h:59
ChatLineStorage::end
iterator end()
Definition: chatlinestorage.h:96
ChatLineStorage::lines
std::vector< ChatLine::Ptr > lines
Definition: chatlinestorage.h:128
ChatLineStorage::erase
void erase(ChatLogIdx idx)
Definition: chatlinestorage.cpp:104
ChatLineStorage::front
reference front()
Definition: chatlinestorage.h:109
ChatLineStorage::idxInfoMap
IdxInfoMap_t idxInfoMap
Definition: chatlinestorage.h:130
ChatLogIdx
NamedType< size_t, struct ChatLogIdxTag, Orderable, UnderlyingAddable, UnitlessDifferencable, Incrementable > ChatLogIdx
Definition: ichatlog.h:38
ChatLineStorage::size_type
Lines_t::size_type size_type
Definition: chatlinestorage.h:67
ChatLineStorage::infoIteratorForIdx
IdxInfoMap_t::iterator infoIteratorForIdx(ChatLogIdx idx)
Definition: chatlinestorage.cpp:162
ChatLineStorage::clear
void clear()
Definition: chatlinestorage.h:102
ChatLineStorage::dateMap
std::map< ChatLine::Ptr, QDateTime > dateMap
Definition: chatlinestorage.h:129
ChatLineStorage::IdxInfoMap_t
std::map< ChatLogIdx, IdxInfo > IdxInfoMap_t
Definition: chatlinestorage.h:63
ChatLineStorage::DateLineMap_t
std::map< ChatLine::Ptr, QDateTime > DateLineMap_t
Definition: chatlinestorage.h:62
ChatLineStorage::back
reference back()
Definition: chatlinestorage.h:110
ChatLineStorage::incrementLinePosAfter
void incrementLinePosAfter(IdxInfoMap_t::iterator it)
Definition: chatlinestorage.cpp:199
ChatLineStorage::contains
bool contains(ChatLogIdx idx) const
Definition: chatlinestorage.h:82
ChatLineStorage::IdxInfo::linePos
size_t linePos
Definition: chatlinestorage.h:58
ChatLineStorage::iterator
Lines_t::iterator iterator
Definition: chatlinestorage.h:71
ChatLine::Ptr
std::shared_ptr< ChatLine > Ptr
Definition: chatline.h:68
ChatLineStorage::Lines_t
std::vector< ChatLine::Ptr > Lines_t
Definition: chatlinestorage.h:61
ChatLineStorage::equivalentInfoIterator
IdxInfoMap_t::iterator equivalentInfoIterator(iterator it)
Definition: chatlinestorage.cpp:152
ChatLineStorage::lastIdx
ChatLogIdx lastIdx() const
Definition: chatlinestorage.h:80