X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FAuthor.cpp;h=12f7137a5f7587a66ee6732dc5ea9351c52c7078;hb=837869452ad8d917615aa4bca77402dc49ba094e;hp=0ad9b898ead7c64fe6112bebd2048a0612bf37f5;hpb=966687d98b0a434b31d8ba2a508a6783c4245c8a;p=lyx.git diff --git a/src/Author.cpp b/src/Author.cpp index 0ad9b898ea..12f7137a5f 100644 --- a/src/Author.cpp +++ b/src/Author.cpp @@ -12,9 +12,8 @@ #include "Author.h" -#include "support/lstrings.h" - #include "support/lassert.h" +#include "support/lstrings.h" #include #include @@ -24,6 +23,24 @@ using namespace lyx::support; namespace lyx { +static int computeHash(docstring const & name, + docstring const & email) +{ + string const full_author_string = to_utf8(name + email); + // Bernstein's hash function + unsigned int hash = 5381; + for (unsigned int i = 0; i < full_author_string.length(); ++i) + hash = ((hash << 5) + hash) + (unsigned int)(full_author_string[i]); + return int(hash); +} + + +Author::Author(docstring const & name, docstring const & email) + : name_(name), email_(email), used_(true) +{ + buffer_id_ = computeHash(name_, email_); +} + bool operator==(Author const & l, Author const & r) { @@ -34,9 +51,9 @@ bool operator==(Author const & l, Author const & r) ostream & operator<<(ostream & os, Author const & a) { // FIXME UNICODE - os << a.buffer_id() << " \"" << to_utf8(a.name()) - << "\" " << to_utf8(a.email()); - + os << a.buffer_id_ << " \"" << to_utf8(a.name_) + << "\" " << to_utf8(a.email_); + return os; } @@ -53,7 +70,7 @@ istream & operator>>(istream & is, Author & a) bool author_smaller(Author const & lhs, Author const & rhs) { - return lhs.buffer_id() < rhs.buffer_id(); + return lhs.bufferId() < rhs.bufferId(); } @@ -65,17 +82,17 @@ AuthorList::AuthorList() int AuthorList::record(Author const & a) { + // If we record an author which equals the current + // author, we copy the buffer_id, so that it will + // keep the same id in the file. + if (!authors_.empty() && a == authors_[0]) + authors_[0].setBufferId(a.bufferId()); + Authors::const_iterator it(authors_.begin()); Authors::const_iterator itend(authors_.end()); - for (int i = 0; it != itend; ++it, ++i) { - if (*it == a) { - if (it->buffer_id() == 0) - // The current author is internally represented as - // author 0, but it appears he has already an id. - it->setBufferId(a.buffer_id()); + if (*it == a) return i; - } } authors_.push_back(a); return last_id_++; @@ -90,6 +107,13 @@ void AuthorList::record(int id, Author const & a) } +void AuthorList::recordCurrentAuthor(Author const & a) +{ + // current author has id 0 + record(0, a); +} + + Author const & AuthorList::get(int id) const { LASSERT(id < (int)authors_.size() , /**/); @@ -121,24 +145,6 @@ ostream & operator<<(ostream & os, AuthorList const & a) { AuthorList::Authors::const_iterator a_it = sorted.begin(); AuthorList::Authors::const_iterator a_end = sorted.end(); - - // Find the buffer id for the current author (internal id 0), - // if he doesn't have a buffer_id yet. - if (sorted.get(0).buffer_id() == 0) { - unsigned int cur_id = 1; - for (; a_it != a_end; ++a_it) { - if (a_it->buffer_id() == cur_id) - ++cur_id; - else if (a_it->buffer_id() > cur_id) { - break; - } - } - // Set the id in both the original authorlist, - // as in the copy. - a.get(0).setBufferId(cur_id); - sorted.get(0).setBufferId(cur_id); - sorted.sort(); - } for (a_it = sorted.begin(); a_it != a_end; ++a_it) { if (a_it->used())