28 #ifndef DOXYGEN_SHOULD_SKIP_THIS 35 template <
template <
typename >
class ALLOC >
38 return __columns.get_allocator();
43 template <
template <
typename >
class ALLOC >
45 ALLOC< DBTranslator< ALLOC > > allocator(this->getAllocator());
46 for (
auto translator : __translators) {
47 allocator.destroy(translator);
48 allocator.deallocate(translator, 1);
51 __translators.clear();
53 __highest_column = std::size_t(0);
58 template <
template <
typename >
class ALLOC >
59 void DBTranslatorSet< ALLOC >::__copy(
60 const DBTranslatorSet< ALLOC >& from,
62 if (__translators.size() != 0) clear();
67 const std::size_t size = from.__translators.size();
68 __translators.reserve(size);
69 __columns.reserve(size);
70 __translators.resize(size);
71 __columns.resize(size);
75 for (i = std::size_t(0); i < size; ++i) {
76 __translators[i] = from.__translators[i]->clone(alloc);
77 __columns[i] = from.__columns[i];
80 __translators.resize(i);
85 __highest_column = from.__highest_column;
90 template <
template <
typename >
class ALLOC >
94 __columns(allocator_type(alloc)) {
100 template <
template <
typename >
class ALLOC >
102 const DBTranslatorSet< ALLOC >& from,
104 __translators(alloc),
113 template <
template <
typename >
class ALLOC >
115 const DBTranslatorSet< ALLOC >& from) :
120 template <
template <
typename >
class ALLOC >
122 DBTranslatorSet< ALLOC >&& from,
124 __translators(
std::move(from.__translators), alloc),
125 __columns(
std::move(from.__columns), alloc),
126 __highest_column(from.__highest_column) {
132 template <
template <
typename >
class ALLOC >
139 template <
template <
typename >
class ALLOC >
142 ALLOC< DBTranslatorSet< ALLOC > > allocator(alloc);
143 DBTranslatorSet< ALLOC >*
set = allocator.allocate(1);
145 allocator.construct(
set, *
this, alloc);
147 allocator.deallocate(
set, 1);
155 template <
template <
typename >
class ALLOC >
162 template <
template <
typename >
class ALLOC >
170 template <
template <
typename >
class ALLOC >
172 operator=(
const DBTranslatorSet< ALLOC >& from) {
183 template <
template <
typename >
class ALLOC >
185 operator=(DBTranslatorSet< ALLOC >&& from) {
188 __translators = std::move(from.__translators);
189 __columns = std::move(from.__columns);
190 __highest_column = from.__highest_column;
198 template <
template <
typename >
class ALLOC >
201 return *(__translators[k]);
206 template <
template <
typename >
class ALLOC >
209 return *(__translators[k]);
214 template <
template <
typename >
class ALLOC >
215 template <
template <
template <
typename >
class >
class Translator >
217 const Translator< ALLOC >& translator,
218 const std::size_t column,
219 const bool unique_column) {
223 const std::size_t size = __translators.size();
225 for (std::size_t i = std::size_t(0); i <
size; ++i) {
226 if (__columns[i] == column)
228 "There already exists a DBTranslator that parses Column" 234 __translators.reserve(size + 1);
235 __columns.reserve(size + 1);
238 ALLOC< DBTranslator< ALLOC > > allocator(this->
getAllocator());
239 DBTranslator< ALLOC >* new_translator =
translator.clone(allocator);
241 __translators.resize(size + 1);
242 __columns.resize(size + 1);
243 __translators[
size] = new_translator;
244 __columns[
size] = column;
247 if (column > __highest_column) __highest_column = column;
254 template <
template <
typename >
class ALLOC >
255 template <
template <
typename >
class XALLOC >
258 const std::size_t column,
259 const std::vector< std::string, XALLOC< std::string > >& missing_symbols,
260 const bool unique_column) {
262 switch (var.varType()) {
264 const LabelizedVariable& xvar =
265 static_cast< const LabelizedVariable&
>(var);
266 DBTranslator4LabelizedVariable< ALLOC >
translator(xvar,
272 const IDiscretizedVariable& xvar =
273 static_cast< const IDiscretizedVariable&
>(var);
274 DBTranslator4DiscretizedVariable< ALLOC >
translator(xvar,
280 const RangeVariable& xvar =
static_cast< const RangeVariable&
>(var);
281 DBTranslator4RangeVariable< ALLOC >
translator(xvar, missing_symbols);
286 const IContinuousVariable& xvar =
287 static_cast< const IContinuousVariable&
>(var);
288 DBTranslator4ContinuousVariable< ALLOC >
translator(xvar,
295 "The insertion of the translator for Variable " 297 <<
" is impossible because a translator " 298 "for such variable is not implemented yet");
304 template <
template <
typename >
class ALLOC >
306 const Variable& var,
const std::size_t column,
const bool unique_column) {
307 const std::vector< std::string, ALLOC< std::string > > missing;
313 template <
template <
typename >
class ALLOC >
315 const bool k_is_input_col) {
316 ALLOC< DBTranslator< ALLOC > > allocator(this->
getAllocator());
317 const std::size_t nb_trans = __translators.size();
319 if (!k_is_input_col) {
320 if (nb_trans < k)
return;
323 allocator.destroy(__translators[k]);
324 allocator.deallocate(__translators[k], 1);
326 const std::size_t colk = __columns[k];
327 __translators.erase(__translators.begin() + k);
328 __columns.erase(__columns.begin() + k);
332 if (__highest_column == colk) {
333 __highest_column = std::size_t(0);
334 for (
const auto col : __columns)
335 if (__highest_column < col) __highest_column = col;
339 auto iter_trans = __translators.rbegin();
340 bool translator_found =
false;
341 for (
auto iter_col = __columns.rbegin(); iter_col != __columns.rend();
342 ++iter_col, ++iter_trans) {
343 if (*iter_col == k) {
345 allocator.destroy(*iter_trans);
346 allocator.deallocate(*iter_trans, 1);
348 __translators.erase((iter_trans + 1).base());
349 __columns.erase((iter_col + 1).base());
350 translator_found =
true;
356 if (translator_found && (k == __highest_column)) {
357 __highest_column = std::size_t(0);
358 for (
const auto col : __columns)
359 if (__highest_column < col) __highest_column = col;
366 template <
template <
typename >
class ALLOC >
367 template <
template <
typename >
class OTHER_ALLOC >
369 const std::vector< std::string, OTHER_ALLOC< std::string > >& row,
370 const std::size_t k)
const {
371 return __translators[k]->translate(row[__columns[k]]);
376 template <
template <
typename >
class ALLOC >
377 template <
template <
typename >
class OTHER_ALLOC >
379 const std::vector< std::string, OTHER_ALLOC< std::string > >& row,
380 const std::size_t k)
const {
381 if (__translators.size() <= k)
382 GUM_ERROR(UndefinedElement,
"Translator #" << k <<
" could not be found");
383 return __translators[k]->translate(row[__columns[k]]);
388 template <
template <
typename >
class ALLOC >
390 const DBTranslatedValue translated_val,
const std::size_t k)
const {
391 return __translators[k]->translateBack(translated_val);
396 template <
template <
typename >
class ALLOC >
398 const DBTranslatedValue translated_val,
const std::size_t k)
const {
399 if (__translators.size() <= k)
400 GUM_ERROR(UndefinedElement,
"Translator #" << k <<
"could not be found");
401 return __translators[k]->translateBack(translated_val);
407 template <
template <
typename >
class ALLOC >
409 const DBTranslatedValue translated_val,
const std::size_t k)
const {
410 return __translators[k]->isMissingValue(translated_val);
416 template <
template <
typename >
class ALLOC >
418 const DBTranslatedValue translated_val,
const std::size_t k)
const {
419 if (__translators.size() <= k)
420 GUM_ERROR(UndefinedElement,
"Translator #" << k <<
"could not be found");
421 return __translators[k]->isMissingValue(translated_val);
426 template <
template <
typename >
class ALLOC >
427 INLINE DBTranslator< ALLOC >&
429 return *(__translators[k]);
434 template <
template <
typename >
class ALLOC >
435 INLINE
const DBTranslator< ALLOC >&
437 return *(__translators[k]);
442 template <
template <
typename >
class ALLOC >
443 INLINE DBTranslator< ALLOC >&
445 if (__translators.size() <= k)
446 GUM_ERROR(UndefinedElement,
"Translator #" << k <<
"could not be found");
447 return *(__translators[k]);
452 template <
template <
typename >
class ALLOC >
453 INLINE
const DBTranslator< ALLOC >&
455 if (__translators.size() <= k)
456 GUM_ERROR(UndefinedElement,
"Translator #" << k <<
"could not be found");
457 return *(__translators[k]);
462 template <
template <
typename >
class ALLOC >
465 return __translators[k]->domainSize();
470 template <
template <
typename >
class ALLOC >
473 if (__translators.size() <= k)
474 GUM_ERROR(UndefinedElement,
"Variable #" << k <<
"could not be found");
475 return __translators[k]->domainSize();
480 template <
template <
typename >
class ALLOC >
481 INLINE
const Variable&
483 return *(__translators[k]->variable());
488 template <
template <
typename >
class ALLOC >
489 INLINE
const Variable&
491 if (__translators.size() <= k)
492 GUM_ERROR(UndefinedElement,
"Variable #" << k <<
"could not be found");
493 return *(__translators[k]->variable());
499 template <
template <
typename >
class ALLOC >
502 return __translators[k]->needsReordering();
508 template <
template <
typename >
class ALLOC >
511 if (__translators.size() <= k)
512 GUM_ERROR(UndefinedElement,
"Variable #" << k <<
"could not be found");
513 return __translators[k]->needsReordering();
519 template <
template <
typename >
class ALLOC >
520 INLINE HashTable< std::size_t,
522 ALLOC< std::pair< std::size_t, std::size_t > > >
524 return __translators[k]->reorder();
530 template <
template <
typename >
class ALLOC >
531 INLINE HashTable< std::size_t,
533 ALLOC< std::pair< std::size_t, std::size_t > > >
535 if (__translators.size() <= k)
536 GUM_ERROR(UndefinedElement,
"Variable #" << k <<
"could not be found");
537 return __translators[k]->reorder();
543 template <
template <
typename >
class ALLOC >
552 template <
template <
typename >
class ALLOC >
555 if (__translators.size() <= k)
556 GUM_ERROR(UndefinedElement,
"Column #" << k <<
"could not be found");
562 template <
template <
typename >
class ALLOC >
564 return __highest_column;
569 template <
template <
typename >
class ALLOC >
571 return __columns.size();
576 template <
template <
typename >
class ALLOC >
578 return __columns.size();
582 template <
template <
typename >
class ALLOC >
584 std::vector< DBTranslator< ALLOC >*, ALLOC< DBTranslator< ALLOC >* > >&
586 return __translators;
HashTable< std::size_t, std::size_t, ALLOC< std::pair< std::size_t, std::size_t > > > reorder(const std::size_t k)
performs a reordering of the dictionary and returns a mapping from the old translated values to the n...
const Variable & variable(const std::size_t k) const
returns the variable stored into the kth translator
const std::vector< DBTranslator< ALLOC > *, ALLOC< DBTranslator< ALLOC > *> > & translators() const
returns the set of translators
void eraseTranslator(const std::size_t k, const bool k_is_input_col=false)
erases either the kth translator or those parsing the kth column of the input database ...
DBTranslatorSet< ALLOC > & operator=(const DBTranslatorSet< ALLOC > &from)
copy operator
std::string translateBack(const DBTranslatedValue translated_val, const std::size_t k) const
returns the original string that was translated into translated_val
const Variable & variableSafe(const std::size_t k) const
returns the variable stored into the kth translator
std::size_t domainSizeSafe(const std::size_t k) const
returns the domain size of the variable stored into the kth translator
std::size_t highestInputColumn() const
returns the largest input database column index read by the translators
DBTranslator< ALLOC > & translatorSafe(const std::size_t k)
returns the kth translator
typename DBTranslator< ALLOC >::allocator_type allocator_type
type for the allocators passed in arguments of methods
std::size_t inputColumnSafe(const std::size_t k) const
returns the column of the input database that will be read by the kth translator
std::size_t nbTranslators() const
returns the number of translators stored into the set
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
DBTranslatorSet(const allocator_type &alloc=allocator_type())
default constructor
DBTranslator< ALLOC > & operator[](const std::size_t k)
returns the kth translator
std::size_t domainSize(const std::size_t k) const
returns the domain size of the variable stored into the kth translator
DBTranslator< ALLOC > & translator(const std::size_t k)
returns the kth translator
bool isMissingValueSafe(const DBTranslatedValue translated_val, const std::size_t k) const
similar to method isMissingValue, except that it checks that the kth translator exists ...
allocator_type getAllocator() const
returns the allocator used by the translator set
std::size_t insertTranslator(const Translator< ALLOC > &translator, const std::size_t column, const bool unique_column=true)
inserts a new translator at the end of the translator set
bool needsReordering(const std::size_t k) const
indicates whether a reordering is needed to make the kth translator sorted
virtual ~DBTranslatorSet()
destructor
std::size_t inputColumn(const std::size_t k) const
returns the column of the input database that will be read by the kth translator
std::string translateBackSafe(const DBTranslatedValue translated_val, const std::size_t k) const
similar to method translateBack, except that it checks that the kth translator exists ...
std::size_t size() const
returns the number of translators stored into the set
DBTranslatedValue translateSafe(const std::vector< std::string, OTHER_ALLOC< std::string > > &row, const std::size_t k) const
similar to method translate, except that it checks that the kth translator exists ...
bool needsReorderingSafe(const std::size_t k) const
same as method needsReordering but checks that the kth translator exists
DBTranslatedValue translate(const std::vector< std::string, OTHER_ALLOC< std::string > > &row, const std::size_t k) const
ask the kth translator to translate a string in a row of the database
void clear()
remove all the translators
HashTable< std::size_t, std::size_t, ALLOC< std::pair< std::size_t, std::size_t > > > reorderSafe(const std::size_t k)
same as method reorder but checks that the kth translator exists
virtual DBTranslatorSet< ALLOC > * clone() const
virtual copy constructor
bool isMissingValue(const DBTranslatedValue translated_val, const std::size_t k) const
indicates whether the kth translator considers a translated_val as a missing value ...
#define GUM_ERROR(type, msg)