LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
fsaStringsPool.cpp
Go to the documentation of this file.
1// Copyright 2002-2020 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6//
7// C++ Implementation: stringspool
8//
9// Description:
10//
11//
12// Author: CEA LIST <Gael.de-Chalendar@cea.fr>
13//
14// Copyright: See COPYING file that comes with this distribution
15//
16//
17#include "fsaStringsPool.h"
19
20#include <QMutex>
21
22using namespace Lima::Common;
23using namespace Lima::Common::Misc;
24
25namespace Lima
26{
27
29{
30 friend class FsaStringsPool;
31
33 virtual ~FsaStringsPoolPrivate();
34
35 void clear();
36 void clear(const uint64_t pos);
37
38 std::shared_ptr<Common::AbstractAccessByString> m_mainKeys;
39 StringsPoolIndex m_mainKeySize;
40 StringsPool m_additionalPool;
41 std::vector<LimaString>* m_cache;
42 QMutex m_mutex;
43};
44
45FsaStringsPoolPrivate::FsaStringsPoolPrivate():
46 m_mainKeys(nullptr),
47 m_mainKeySize(0),
48 m_additionalPool(),
49 m_cache(nullptr),
50 m_mutex()
51{}
52
53
54FsaStringsPoolPrivate::~FsaStringsPoolPrivate()
55{
56 delete m_cache;
57}
58
62
63
65{
66 delete m_d;
67}
68
69void FsaStringsPool::registerMainKeys(std::shared_ptr<AbstractAccessByString> mainKeys)
70{
72 LINFO << "register main keys" ;
73
74 if (!m_d->m_additionalPool.empty())
75 {
76 LIMA_EXCEPTION( "Can't register main keys if stringspool not empty!" << QTENDL
77 << "contains " << m_d->m_additionalPool[static_cast<StringsPoolIndex>(1)] );
78 }
79 if (mainKeys == nullptr)
80 {
81 LIMA_EXCEPTION( "Can't register null main keys!" );
82 }
83
84 m_d->m_mainKeys=mainKeys;
85 m_d->m_mainKeySize=m_d->m_mainKeys->getSize();
86 m_d->m_cache=new std::vector<LimaString>(m_d->m_mainKeySize,LimaString());
87}
88
89
90StringsPoolIndex FsaStringsPool::operator[](const LimaString& str)
91{
92 if (m_d->m_mainKeys)
93 {
94 StringsPoolIndex res= static_cast<StringsPoolIndex>(m_d->m_mainKeys->getIndex(str));
95 if (res!=static_cast<StringsPoolIndex>(0))
96 {
97 QMutexLocker lock(&m_d->m_mutex);
98 LimaString& cachedStr=(*m_d->m_cache)[res];
99 if (cachedStr.size()==0)
100 {
101 cachedStr=str;
102 }
103 return res;
104 }
105 }
106 return static_cast<StringsPoolIndex>(m_d->m_mainKeySize + m_d->m_additionalPool[str]);
107}
108
109const LimaString& FsaStringsPool::operator[](const StringsPoolIndex ind) const
110{
111 // STRPOOLLOGINIT;
112 // LDEBUG << "const FsaStringsPool[" << ind << "]" ;
113 if (ind < m_d->m_mainKeySize)
114 {
115 QMutexLocker lock(&m_d->m_mutex);
116 LimaString& str=(*m_d->m_cache)[ind];
117 if (ind == static_cast<StringsPoolIndex>(0))
118 {
119 return str;
120 }
121 if (str.size()==0)
122 {
123 str= LimaString(m_d->m_mainKeys->getSpelling(ind));
124 }
125 return str;
126 }
127 return m_d->m_additionalPool[static_cast<StringsPoolIndex>(ind - m_d->m_mainKeySize)];
128}
129
131{
132 m_d->m_additionalPool.registerUser(p);
133}
134
136{
137 m_d->m_additionalPool.unregisterUser(p);
138}
139
141{
142 m_d->m_additionalPool.endResourcesPool();
143}
144
145
146} // closing namespace Lima
#define QTENDL
Definition LimaCommon.h:32
#define LIMA_EXCEPTION(X)
This macro writes the message X to a previously configured error stream before throwing a LimaExcepti...
Definition LimaCommon.h:293
#define STRPOOLLOGINIT
Definition LimaCommon.h:215
#define LINFO
Definition LimaCommon.h:158
void registerMainKeys(std::shared_ptr< Common::AbstractAccessByString > mainKeys)
StringsPoolIndex operator[](const LimaString &str)
void unregisterUser(void *p)
void registerUser(void *p)
void unregisterUser(void *p)
bool empty() const
NAUTITIA.
QString LimaString
Definition LimaString.h:33