Can someone have a look at the attached patch, which is directed at bug
4775? The idea is to cache the BibTeX info in Buffer. It looks harmless
enough, but I'm getting linking errors. It looks like nothing in
BiblioInfo.cpp is being seen by the linker, but I can't see what's wrong
here.
Errors below, and thanks.
rh
====
./.libs/liblyxinsets.a(InsetBibitem.o): In function
`lyx::InsetBibitem::fillWithBibKeys(lyx::BiblioInfo&, lyx::InsetIterator
const&) const':
/cvs/lyx-devel/trunk/src/insets/InsetBibitem.cpp:232: undefined
reference to `lyx::BibTeXInfo::BibTeXInfo(bool)'
./.libs/liblyxinsets.a(InsetBibitem.o): In function
`__gnu_norm::map<std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> >, lyx::BibTeXInfo,
std::less<std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > >,
std::allocator<std::pair<std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const,
lyx::BibTeXInfo> > >::operator[](std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)':
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:348:
undefined reference to `lyx::BibTeXInfo::BibTeXInfo(bool)'
./.libs/liblyxinsets.a(InsetBibitem.o): In function
`lyx::InsetBibitem::updateCommand(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, bool)':
/cvs/lyx-devel/trunk/src/insets/InsetBibitem.cpp:69: undefined reference
to `lyx::BiblioInfo::getKeys() const'
./.libs/liblyxinsets.a(InsetBibitem.o): In function
`__gnu_cxx::_DefaultConstructibleConcept<lyx::BibTeXInfo>::__constraints()':
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/boost_concept_check.h:169:
undefined reference to `lyx::BibTeXInfo::BibTeXInfo(bool)'
./.libs/liblyxinsets.a(InsetBibtex.o): In function
`lyx::InsetBibtex::fillWithBibKeys(lyx::BiblioInfo&, lyx::InsetIterator
const&) const':
/cvs/lyx-devel/trunk/src/insets/InsetBibtex.cpp:667: undefined reference
to `lyx::BibTeXInfo::BibTeXInfo(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&,
std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > const&)'
./.libs/liblyxinsets.a(InsetBibtex.o): In function
`__gnu_norm::map<std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> >, lyx::BibTeXInfo,
std::less<std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > >,
std::allocator<std::pair<std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const,
lyx::BibTeXInfo> > >::operator[](std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)':
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:348:
undefined reference to `lyx::BibTeXInfo::BibTeXInfo(bool)'
./.libs/liblyxinsets.a(InsetCitation.o): In function `complexLabel':
/cvs/lyx-devel/trunk/src/insets/InsetCitation.cpp:248: undefined
reference to
`lyx::BiblioInfo::getAbbreviatedAuthor(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const'
/cvs/lyx-devel/trunk/src/insets/InsetCitation.cpp:249: undefined
reference to `lyx::BiblioInfo::getYear(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const'
./.libs/liblyxinsets.a(InsetInclude.o): In function
`lyx::InsetInclude::fillWithBibKeys(lyx::BiblioInfo&, lyx::InsetIterator
const&) const':
/cvs/lyx-devel/trunk/src/insets/InsetInclude.cpp:691: undefined
reference to `lyx::BiblioInfo::mergeBiblioInfo(lyx::BiblioInfo const&)'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::getInfo(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:657: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:660: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:660: undefined
reference to `lyx::BiblioInfo::getInfo(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::availableEntries() const':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:623: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:623: undefined
reference to `lyx::BiblioInfo::getEntries() const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::availableFields() const':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:617: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:617: undefined
reference to `lyx::BiblioInfo::getFields() const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::availableKeys() const':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:611: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:611: undefined
reference to `lyx::BiblioInfo::getKeys() const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::citationStyles(int)':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:578: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:578: undefined
reference to `lyx::BiblioInfo::getCiteStrings(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, lyx::Buffer
const&) const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::filterByEntryType(__gnu_debug_def::vector<std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> >,
std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > > >&, std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> >)':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:639: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:640: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::updateStyle()':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:246: undefined
reference to `lyx::citationStyleFromString(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&)'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::searchKeys(__gnu_debug_def::vector<std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> >,
std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > > > const&, bool, std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&,
std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> >, bool, bool)':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:717: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:718: undefined
reference to `lyx::frontend::GuiCitation::getBibInfo() const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:727: undefined
reference to `lyx::BibTeXInfo::hasField(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const'
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:728: undefined
reference to
`lyx::BibTeXInfo::getValueForField(std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::initialiseParams(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&)':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:598: undefined
reference to `lyx::citeStyles(lyx::CiteEngine)'
frontends/qt4/.libs/liblyxqt4.a(GuiCitation.o): In function
`lyx::frontend::GuiCitation::apply(int, bool, bool, QString, QString)':
/cvs/lyx-devel/trunk/src/frontends/qt4/GuiCitation.cpp:466: undefined
reference to `lyx::citationStyleToString(lyx::CitationStyle const&)'
collect2: ld returned 1 exit status
make[2]: *** [lyx] Error 1
make[2]: Leaving directory `/cvs/lyx-devel/trunk/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/cvs/lyx-devel/trunk/src'
make: *** [all] Error 2
Index: insets/InsetBibitem.cpp
===================================================================
--- insets/InsetBibitem.cpp (revision 24476)
+++ insets/InsetBibitem.cpp (working copy)
@@ -66,9 +66,7 @@
docstring const old_key = getParam("key");
docstring key = new_key;
- BiblioInfo keys;
- keys.fillWithBibKeys(&buffer());
- vector<docstring> bibkeys = keys.getKeys();
+ vector<docstring> bibkeys = buffer().getBiblioInfo().getKeys();
int i = 1;
Index: insets/InsetInclude.cpp
===================================================================
--- insets/InsetInclude.cpp (revision 24476)
+++ insets/InsetInclude.cpp (working copy)
@@ -687,7 +687,8 @@
Buffer * tmp = theBufferList().getBuffer(included_file);
//FIXME This is kind of a dirty hack and should be made reasonable.
tmp->setParent(0);
- keys.fillWithBibKeys(tmp);
+ BiblioInfo const & newkeys = tmp->getBiblioInfo();
+ keys.mergeBiblioInfo(newkeys);
tmp->setParent(&buffer());
}
}
Index: insets/InsetCitation.cpp
===================================================================
--- insets/InsetCitation.cpp (revision 24476)
+++ insets/InsetCitation.cpp (working copy)
@@ -137,6 +137,9 @@
if (!buffer.isFullyLoaded())
return docstring();
+#if 0
+ // FIXME This caching stuff will be moved to Buffer...
+
// Cache the labels
typedef map<Buffer const *, BiblioInfo> CachedMap;
static CachedMap cached_keys;
@@ -144,8 +147,6 @@
// and cache the timestamp of the bibliography files.
static map<FileName, time_t> bibfileStatus;
- BiblioInfo biblist;
-
support::FileNameList const & bibfilesCache = buffer.getBibfilesCache();
// compare the cached timestamps with the actual ones.
bool changed = false;
@@ -167,7 +168,9 @@
// use the cached keys
biblist = cached_keys[&buffer];
}
+#endif
+ BiblioInfo const & biblist = buffer.getBiblioInfo();
if (biblist.empty())
return docstring();
Index: BiblioInfo.h
===================================================================
--- BiblioInfo.h (revision 24476)
+++ BiblioInfo.h (working copy)
@@ -99,8 +99,6 @@
class BiblioInfo {
public:
///
- BiblioInfo() {}
- ///
typedef std::map<docstring, BibTeXInfo>::const_iterator const_iterator;
/// Returns a sorted vector of bibliography keys
std::vector<docstring> const getKeys() const;
@@ -108,9 +106,6 @@
std::vector<docstring> const getFields() const;
/// Returns a sorted vector of BibTeX entry types in use
std::vector<docstring> const getEntries() const;
- /// Fills keys with BibTeX information derived from the various insets
- /// in a given buffer, in its master document.
- void fillWithBibKeys(Buffer const * const buf);
/// return the short form of an authorlist
docstring const getAbbreviatedAuthor(docstring const & key) const;
/// return the year from the bibtex data record
@@ -159,6 +154,8 @@
///
const_iterator find(docstring const & f) const { return bimap_.find(f); }
///
+ void mergeBiblioInfo(BiblioInfo const & info);
+ ///
BibTeXInfo & operator[](docstring const & f) { return bimap_[f]; }
///
void addFieldName(docstring const & f) { field_names_.insert(f); }
Index: Buffer.h
===================================================================
--- Buffer.h (revision 24476)
+++ Buffer.h (working copy)
@@ -24,6 +24,7 @@
namespace lyx {
+class BiblioInfo;
class BufferParams;
class DocIterator;
class ErrorItem;
@@ -309,6 +310,8 @@
/// of loaded child documents).
support::FileNameList const & getBibfilesCache() const;
///
+ BiblioInfo const & getBiblioInfo() const;
+ ///
void getLabelList(std::vector<docstring> &) const;
///
Index: frontends/qt4/GuiCitation.h
===================================================================
--- frontends/qt4/GuiCitation.h (revision 24476)
+++ frontends/qt4/GuiCitation.h (working copy)
@@ -184,7 +184,7 @@
private:
/// The BibTeX information available to the dialog
- BiblioInfo bibkeysInfo_;
+ BiblioInfo const & getBibInfo() const;
};
} // namespace frontend
Index: frontends/qt4/GuiCitation.cpp
===================================================================
--- frontends/qt4/GuiCitation.cpp (revision 24476)
+++ frontends/qt4/GuiCitation.cpp (working copy)
@@ -575,7 +575,7 @@
QStringList GuiCitation::citationStyles(int sel)
{
docstring const key = qstring_to_ucs4(cited_keys_[sel]);
- return to_qstring_list(bibkeysInfo_.getCiteStrings(key, buffer()));
+ return to_qstring_list(getBibInfo().getCiteStrings(key, buffer()));
}
@@ -595,7 +595,6 @@
{
InsetCommand::string2params("citation", data, params_);
CiteEngine const engine = buffer().params().citeEngine();
- bibkeysInfo_.fillWithBibKeys(&buffer());
citeStyles_ = citeStyles(engine);
return true;
}
@@ -604,25 +603,24 @@
void GuiCitation::clearParams()
{
params_.clear();
- bibkeysInfo_.clear();
}
vector<docstring> GuiCitation::availableKeys() const
{
- return bibkeysInfo_.getKeys();
+ return getBibInfo().getKeys();
}
vector<docstring> GuiCitation::availableFields() const
{
- return bibkeysInfo_.getFields();
+ return getBibInfo().getFields();
}
vector<docstring> GuiCitation::availableEntries() const
{
- return bibkeysInfo_.getEntries();
+ return getBibInfo().getEntries();
}
@@ -638,8 +636,8 @@
vector<docstring> result;
for (; it != end; ++it) {
docstring const key = *it;
- BiblioInfo::const_iterator cit = bibkeysInfo_.find(key);
- if (cit == bibkeysInfo_.end())
+ BiblioInfo::const_iterator cit = getBibInfo().find(key);
+ if (cit == getBibInfo().end())
continue;
if (cit->second.entryType() == entry_type)
result.push_back(key);
@@ -656,10 +654,10 @@
docstring GuiCitation::getInfo(docstring const & key) const
{
- if (bibkeysInfo_.empty())
+ if (getBibInfo().empty())
return docstring();
- return bibkeysInfo_.getInfo(key);
+ return getBibInfo().getInfo(key);
}
@@ -716,8 +714,8 @@
vector<docstring>::const_iterator it = keys_to_search.begin();
vector<docstring>::const_iterator end = keys_to_search.end();
for (; it != end; ++it ) {
- BiblioInfo::const_iterator info = bibkeysInfo_.find(*it);
- if (info == bibkeysInfo_.end())
+ BiblioInfo::const_iterator info = getBibInfo().find(*it);
+ if (info == getBibInfo().end())
continue;
BibTeXInfo const & kvm = info->second;
Index: BiblioInfo.cpp
===================================================================
--- BiblioInfo.cpp (revision 24476)
+++ BiblioInfo.cpp (working copy)
@@ -75,7 +75,7 @@
}
-static docstring familyName(docstring const & name)
+docstring familyName(docstring const & name)
{
if (name.empty())
return docstring();
@@ -416,19 +416,9 @@
}
-void BiblioInfo::fillWithBibKeys(Buffer const * const buf)
-{
- /// if this is a child document and the parent is already loaded
- /// use the parent's list instead [ale990412]
- Buffer const * const tmp = buf->masterBuffer();
- LASSERT(tmp, return);
- if (tmp != buf) {
- this->fillWithBibKeys(tmp);
- return;
- }
-
- for (InsetIterator it = inset_iterator_begin(buf->inset()); it; ++it)
- it->fillWithBibKeys(*this, it);
+void BiblioInfo::mergeBiblioInfo(BiblioInfo const & info)
+{
+ bimap_.insert(info.begin(), info.end());
}
Index: Buffer.cpp
===================================================================
--- Buffer.cpp (revision 24476)
+++ Buffer.cpp (working copy)
@@ -205,6 +205,9 @@
/// documents), needed for appropriate update of natbib labels.
mutable support::FileNameList bibfilesCache_;
+ /// A cache for bibliography info
+ mutable BiblioInfo bibinfo_;
+
mutable RefCache ref_cache_;
/// our Text that should be wrapped in an InsetText
@@ -1351,6 +1354,21 @@
}
+BiblioInfo const & Buffer::getBiblioInfo() const
+{
+ /// if this is a child document and the parent is already loaded
+ /// use the parent's list instead [ale990412]
+ Buffer const * const tmp = masterBuffer();
+ LASSERT(tmp, /**/);
+ if (tmp != this)
+ return tmp->getBiblioInfo();
+
+ for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
+ it->fillWithBibKeys(d->bibinfo_, it);
+ return d->bibinfo_;
+}
+
+
bool Buffer::isDepClean(string const & name) const
{
DepClean::const_iterator const it = d->dep_clean.find(name);
@@ -1986,8 +2004,7 @@
// Check if the label 'from' appears more than once
vector<docstring> labels;
string paramName;
- BiblioInfo keys;
- keys.fillWithBibKeys(this);
+ BiblioInfo const & keys = getBiblioInfo();
BiblioInfo::const_iterator bit = keys.begin();
BiblioInfo::const_iterator bend = keys.end();