diff options
author | Alexander Gutkin <agutkin@google.com> | 2012-09-12 18:11:43 +0100 |
---|---|---|
committer | Alexander Gutkin <agutkin@google.com> | 2012-09-12 18:11:43 +0100 |
commit | dfd8b8327b93660601d016cdc6f29f433b45a8d8 (patch) | |
tree | 968ec84b8e32ad73ec18d74334930f36b7471906 /src/include/fst/bi-table.h | |
parent | f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2 (diff) | |
download | openfst-dfd8b8327b93660601d016cdc6f29f433b45a8d8.tar.gz |
Updated OpenFST version to openfst-1.3.2-CL32004048 from Greco3.
Change-Id: I19b0db718256b35c0e3e5a7315f1ed6335e6dcac
Diffstat (limited to 'src/include/fst/bi-table.h')
-rw-r--r-- | src/include/fst/bi-table.h | 81 |
1 files changed, 53 insertions, 28 deletions
diff --git a/src/include/fst/bi-table.h b/src/include/fst/bi-table.h index dbb436c..bd37781 100644 --- a/src/include/fst/bi-table.h +++ b/src/include/fst/bi-table.h @@ -39,8 +39,9 @@ namespace fst { // // Required constructors. // BiTable(); // -// // Lookup integer ID from entry. If it doesn't exist, then add it. -// I FindId(const T &entry); +// // Lookup integer ID from entry. If it doesn't exist and 'insert' +// / is true, then add it. Otherwise return -1. +// I FindId(const T &entry, bool insert = true); // // Lookup entry from integer ID. // const T &FindEntry(I) const; // // # of stored entries. @@ -58,11 +59,15 @@ class HashBiTable { T empty_entry; } - I FindId(const T &entry) { + I FindId(const T &entry, bool insert = true) { I &id_ref = entry2id_[entry]; - if (id_ref == 0) { // T not found; store and assign it a new ID. - id2entry_.push_back(entry); - id_ref = id2entry_.size(); + if (id_ref == 0) { // T not found + if (insert) { // store and assign it a new ID + id2entry_.push_back(entry); + id_ref = id2entry_.size(); + } else { + return -1; + } } return id_ref - 1; // NB: id_ref = ID + 1 } @@ -109,14 +114,18 @@ class CompactHashBiTable { id2entry_.reserve(table_size); } - I FindId(const T &entry) { + I FindId(const T &entry, bool insert = true) { current_entry_ = &entry; typename KeyHashSet::const_iterator it = keys_.find(kCurrentKey); - if (it == keys_.end()) { - I key = id2entry_.size(); - id2entry_.push_back(entry); - keys_.insert(key); - return key; + if (it == keys_.end()) { // T not found + if (insert) { // store and assign it a new ID + I key = id2entry_.size(); + id2entry_.push_back(entry); + keys_.insert(key); + return key; + } else { + return -1; + } } else { return *it; } @@ -191,14 +200,18 @@ class VectorBiTable { ~VectorBiTable() { delete fp_; } - I FindId(const T &entry) { + I FindId(const T &entry, bool insert = true) { ssize_t fp = (*fp_)(entry); if (fp >= fp2id_.size()) fp2id_.resize(fp + 1); I &id_ref = fp2id_[fp]; - if (id_ref == 0) { // T not found; store and assign it a new ID. - id2entry_.push_back(entry); - id_ref = id2entry_.size(); + if (id_ref == 0) { // T not found + if (insert) { // store and assign it a new ID + id2entry_.push_back(entry); + id_ref = id2entry_.size(); + } else { + return -1; + } } return id_ref - 1; // NB: id_ref = ID + 1 } @@ -251,24 +264,32 @@ class VectorHashBiTable { delete h_; } - I FindId(const T &entry) { + I FindId(const T &entry, bool insert = true) { if ((*selector_)(entry)) { // Use the vector if 'selector_(entry) == true' uint64 fp = (*fp_)(entry); if (fp2id_.size() <= fp) fp2id_.resize(fp + 1, 0); - if (fp2id_[fp] == 0) { - id2entry_.push_back(entry); - fp2id_[fp] = id2entry_.size(); + if (fp2id_[fp] == 0) { // T not found + if (insert) { // store and assign it a new ID + id2entry_.push_back(entry); + fp2id_[fp] = id2entry_.size(); + } else { + return -1; + } } return fp2id_[fp] - 1; // NB: assoc_value = ID + 1 } else { // Use the hash table otherwise. current_entry_ = &entry; typename KeyHashSet::const_iterator it = keys_.find(kCurrentKey); if (it == keys_.end()) { - I key = id2entry_.size(); - id2entry_.push_back(entry); - keys_.insert(key); - return key; + if (insert) { + I key = id2entry_.size(); + id2entry_.push_back(entry); + keys_.insert(key); + return key; + } else { + return -1; + } } else { return *it; } @@ -357,11 +378,15 @@ class ErasableBiTable { public: ErasableBiTable() : first_(0) {} - I FindId(const T &entry) { + I FindId(const T &entry, bool insert = true) { I &id_ref = entry2id_[entry]; - if (id_ref == 0) { // T not found; store and assign it a new ID. - id2entry_.push_back(entry); - id_ref = id2entry_.size() + first_; + if (id_ref == 0) { // T not found + if (insert) { // store and assign it a new ID + id2entry_.push_back(entry); + id_ref = id2entry_.size() + first_; + } else { + return -1; + } } return id_ref - 1; // NB: id_ref = ID + 1 } |