Commit 909a33c0 by maarten

optimisation process started

git-svn-id: svn+ssh://gitlab/srv/svn-repos/pdb-redo/trunk@342 a1961a4f-ab94-4bcc-80e8-33b5a54de466
parent f66bd7fd
...@@ -236,6 +236,7 @@ namespace detail ...@@ -236,6 +236,7 @@ namespace detail
struct ItemReference struct ItemReference
{ {
const char* mName; const char* mName;
size_t mColumn;
ItemRow* mRow; ItemRow* mRow;
template<typename T> template<typename T>
...@@ -389,14 +390,16 @@ namespace detail ...@@ -389,14 +390,16 @@ namespace detail
return mRow[mColumns[ix]]; return mRow[mColumns[ix]];
} }
getRowResult(const Row& r, C... columns) getRowResult(const Row& r, std::array<size_t, N>&& columns)
: mRow(r), mColumns({{columns...}}) {} : mRow(r), mColumns(std::move(columns))
{
}
template<typename... Ts> template<typename... Ts>
operator std::tuple<Ts...>() const; operator std::tuple<Ts...>() const;
const Row& mRow; const Row& mRow;
std::array<const char*, N> mColumns; std::array<size_t, N> mColumns;
}; };
// we want to be able to tie some variables to a RowResult, for this we use tiewraps // we want to be able to tie some variables to a RowResult, for this we use tiewraps
...@@ -550,30 +553,45 @@ class Row ...@@ -550,30 +553,45 @@ class Row
// TODO: implement real const version? // TODO: implement real const version?
const detail::ItemReference operator[](const char* ItemTag) const const detail::ItemReference operator[](size_t column) const
{
return detail::ItemReference{"<anonymous column>", column, mData};
}
const detail::ItemReference operator[](const char* itemTag) const
{ {
return detail::ItemReference{ItemTag, mData}; size_t column = ColumnForItemTag(itemTag);
return detail::ItemReference{itemTag, column, mData};
} }
detail::ItemReference operator[](const char* ItemTag) detail::ItemReference operator[](const char* itemTag)
{ {
return detail::ItemReference{ItemTag, mData}; size_t column = ColumnForItemTag(itemTag);
return detail::ItemReference{itemTag, column, mData};
} }
const detail::ItemReference operator[](const string& ItemTag) const const detail::ItemReference operator[](const string& itemTag) const
{ {
return detail::ItemReference{ItemTag.c_str(), mData}; size_t column = ColumnForItemTag(itemTag.c_str());
return detail::ItemReference{itemTag.c_str(), column, mData};
} }
detail::ItemReference operator[](const string& ItemTag) detail::ItemReference operator[](const string& itemTag)
{ {
return detail::ItemReference{ItemTag.c_str(), mData}; size_t column = ColumnForItemTag(itemTag.c_str());
return detail::ItemReference{itemTag.c_str(), column, mData};
} }
template<typename... C> template<typename... C>
auto get(C... columns) const -> detail::getRowResult<C...> auto get(C... columns) const -> detail::getRowResult<C...>
{ {
return detail::getRowResult<C...>(*this, columns...); std::array<size_t,sizeof...(C)> cix;
auto c = cix.begin();
for (auto col: { columns... })
*c++ = ColumnForItemTag(col);
return detail::getRowResult<C...>(*this, std::move(cix));
} }
bool operator==(const Row& rhs) const bool operator==(const Row& rhs) const
...@@ -591,9 +609,12 @@ class Row ...@@ -591,9 +609,12 @@ class Row
private: private:
void assign(const string& name, const string& value, bool emplacing); void assign(const string& name, const string& value, bool emplacing);
void assign(size_t column, const string& value, bool emplacing);
void assign(const Item& i, bool emplacing); void assign(const Item& i, bool emplacing);
static void swap(const string& name, ItemRow* a, ItemRow* b); static void swap(size_t column, ItemRow* a, ItemRow* b);
size_t ColumnForItemTag(const char* itemTag) const;
ItemRow* mData; ItemRow* mData;
uint32 mLineNr = 0; uint32 mLineNr = 0;
...@@ -1104,6 +1125,8 @@ class Category ...@@ -1104,6 +1125,8 @@ class Category
iset mandatoryFields() const; iset mandatoryFields() const;
iset keyFields() const; iset keyFields() const;
std::set<size_t> keyFieldsByIndex() const;
void drop(const string& field); void drop(const string& field);
void getTagOrder(vector<string>& tags) const; void getTagOrder(vector<string>& tags) const;
......
...@@ -130,7 +130,7 @@ class Validator ...@@ -130,7 +130,7 @@ class Validator
void addCategoryValidator(ValidateCategory&& v); void addCategoryValidator(ValidateCategory&& v);
const ValidateCategory* getValidatorForCategory(std::string category) const; const ValidateCategory* getValidatorForCategory(std::string category) const;
void reportError(const std::string& msg); void reportError(const std::string& msg, bool fatal);
std::string dictName() const { return mName; } std::string dictName() const { return mName; }
void dictName(const std::string& name) { mName = name; } void dictName(const std::string& name) { mName = name; }
......
...@@ -183,18 +183,18 @@ typedef std::vector<Atom> AtomView; ...@@ -183,18 +183,18 @@ typedef std::vector<Atom> AtomView;
class Residue class Residue
{ {
public: public:
Residue() = default; Residue(const Residue& rhs) = delete;
Residue(const Residue& rhs) = default; Residue& operator=(const Residue& rhs) = delete;
Residue& operator=(const Residue& rhs) = default;
Residue(const Structure& structure) Residue(Residue&& rhs);
: mStructure(&structure) {} Residue& operator=(Residue&& rhs);
Residue(const Structure& structure, const std::string& compoundID, Residue(const Structure& structure, const std::string& compoundID,
const std::string& asymID, int seqID = 0, const std::string& asymID, int seqID = 0)
const std::string& altID = "")
: mStructure(&structure), mCompoundID(compoundID) : mStructure(&structure), mCompoundID(compoundID)
, mAsymID(asymID), mAltID(altID), mSeqID(seqID) {} , mAsymID(asymID), mSeqID(seqID) {}
virtual ~Residue() {}
const Compound& compound() const; const Compound& compound() const;
const AtomView& atoms() const; const AtomView& atoms() const;
...@@ -204,7 +204,6 @@ class Residue ...@@ -204,7 +204,6 @@ class Residue
const std::string& compoundID() const { return mCompoundID; } const std::string& compoundID() const { return mCompoundID; }
const std::string& asymID() const { return mAsymID; } const std::string& asymID() const { return mAsymID; }
int seqID() const { return mSeqID; } int seqID() const { return mSeqID; }
const std::string& altID() const { return mAltID; }
int authSeqID() const; int authSeqID() const;
std::string authInsCode() const; std::string authInsCode() const;
...@@ -226,10 +225,14 @@ class Residue ...@@ -226,10 +225,14 @@ class Residue
protected: protected:
Residue() {}
friend class Polymer;
const Structure* mStructure = nullptr; const Structure* mStructure = nullptr;
std::string mCompoundID, mAsymID, mAltID; std::string mCompoundID, mAsymID;
int mSeqID = 0; int mSeqID = 0;
mutable AtomView mAtoms; AtomView mAtoms;
}; };
// -------------------------------------------------------------------- // --------------------------------------------------------------------
...@@ -238,13 +241,16 @@ class Residue ...@@ -238,13 +241,16 @@ class Residue
class Monomer : public Residue class Monomer : public Residue
{ {
public: public:
Monomer(); // Monomer();
Monomer(const Monomer& rhs); Monomer(const Monomer& rhs) = delete;
Monomer& operator=(const Monomer& rhs); Monomer& operator=(const Monomer& rhs) = delete;
Monomer(const Polymer& polymer, uint32 index); Monomer(Monomer&& rhs);
Monomer& operator=(Monomer&& rhs);
// Monomer(const Polymer& polymer, uint32 index);
Monomer(const Polymer& polymer, uint32 index, int seqID, Monomer(const Polymer& polymer, uint32 index, int seqID,
const std::string& compoundID, const std::string& altID); const std::string& compoundID);
// Assuming this is really an amino acid... // Assuming this is really an amino acid...
...@@ -276,62 +282,20 @@ class Monomer : public Residue ...@@ -276,62 +282,20 @@ class Monomer : public Residue
// -------------------------------------------------------------------- // --------------------------------------------------------------------
class Polymer class Polymer : public std::vector<Monomer>
{ {
public: public:
Polymer(const Structure& s, const std::string& asymID); // Polymer(const Structure& s, const std::string& asymID);
Polymer(const Structure& s, const std::string& entityID, const std::string& asymID); Polymer(const Structure& s, const std::string& entityID, const std::string& asymID);
Polymer(const Polymer&) = default;
Polymer& operator=(const Polymer&) = default;
struct iterator : public std::iterator<std::random_access_iterator_tag, Monomer>
{
typedef std::iterator<std::bidirectional_iterator_tag, Monomer> base_type;
typedef base_type::reference reference;
typedef base_type::pointer pointer;
iterator(const Polymer& p, uint32 index); Polymer(const Polymer&) = delete;
iterator(iterator&& rhs); Polymer& operator=(const Polymer&) = delete;
iterator(const iterator& rhs); Polymer(Polymer&& rhs);
iterator& operator=(const iterator& rhs); Polymer& operator=(Polymer&& rhs);
// iterator& operator=(iterator&& rhs);
reference operator*() { return mCurrent; } Monomer& getBySeqID(int seqID);
pointer operator->() { return &mCurrent; } const Monomer& getBySeqID(int seqID) const;
iterator& operator++();
iterator operator++(int)
{
iterator result(*this);
operator++();
return result;
}
iterator& operator--();
iterator operator--(int)
{
iterator result(*this);
operator--();
return result;
}
bool operator==(const iterator& rhs) const { return mPolymer == rhs.mPolymer and mIndex == rhs.mIndex; }
bool operator!=(const iterator& rhs) const { return mPolymer != rhs.mPolymer or mIndex != rhs.mIndex; }
private:
const Polymer* mPolymer;
uint32 mIndex;
Monomer mCurrent;
};
iterator begin() const;
iterator end() const;
size_t size() const { return mPolySeq.size(); }
Monomer operator[](size_t index) const;
Monomer getBySeqID(int seqID) const;
Structure* structure() const { return mStructure; } Structure* structure() const { return mStructure; }
...@@ -344,8 +308,6 @@ class Polymer ...@@ -344,8 +308,6 @@ class Polymer
private: private:
friend struct iterator;
Structure* mStructure; Structure* mStructure;
std::string mEntityID; std::string mEntityID;
std::string mAsymID; std::string mAsymID;
...@@ -398,7 +360,8 @@ class Structure ...@@ -398,7 +360,8 @@ class Structure
const AtomView& atoms() const; const AtomView& atoms() const;
AtomView waters() const; AtomView waters() const;
std::vector<Polymer> polymers() const; const std::vector<Polymer>& polymers() const;
std::vector<Residue> nonPolymers() const; std::vector<Residue> nonPolymers() const;
Atom getAtomById(std::string id) const; Atom getAtomById(std::string id) const;
...@@ -444,7 +407,13 @@ class Structure ...@@ -444,7 +407,13 @@ class Structure
cif::Category& category(const char* name) const; cif::Category& category(const char* name) const;
cif::Datablock& datablock() const; cif::Datablock& datablock() const;
struct StructureImpl* mImpl; void insertCompound(const std::string& compoundID, bool isEntity);
File& mFile;
uint32 mModelNr;
AtomView mAtoms;
std::vector<Polymer> mPolymers;
// std::vector<Residue*> mResidues;
}; };
} }
...@@ -224,11 +224,9 @@ const char* ItemReference::c_str() const ...@@ -224,11 +224,9 @@ const char* ItemReference::c_str() const
{ {
// assert(mRow->mCategory); // assert(mRow->mCategory);
auto cix = mRow->mCategory->getColumnIndex(mName);
for (auto iv = mRow->mValues; iv != nullptr; iv = iv->mNext) for (auto iv = mRow->mValues; iv != nullptr; iv = iv->mNext)
{ {
if (iv->mColumnIndex == cix) if (iv->mColumnIndex == mColumn)
{ {
if (iv->mText[0] != '.' or iv->mText[1] != 0) if (iv->mText[0] != '.' or iv->mText[1] != 0)
result = iv->mText; result = iv->mText;
...@@ -247,19 +245,9 @@ const char* ItemReference::c_str(const char* defaultValue) const ...@@ -247,19 +245,9 @@ const char* ItemReference::c_str(const char* defaultValue) const
if (mRow != nullptr and mRow->mCategory != nullptr) if (mRow != nullptr and mRow->mCategory != nullptr)
{ {
// assert(mRow->mCategory);
auto cix = mRow->mCategory->getColumnIndex(mName);
if (cix < mRow->mCategory->mColumns.size())
{
auto iv = mRow->mCategory->mColumns[cix].mValidator;
if (iv != nullptr and not iv->mDefault.empty())
result = iv->mDefault.c_str();
for (auto iv = mRow->mValues; iv != nullptr; iv = iv->mNext) for (auto iv = mRow->mValues; iv != nullptr; iv = iv->mNext)
{ {
if (iv->mColumnIndex == cix) if (iv->mColumnIndex == mColumn)
{ {
// only really non-empty values // only really non-empty values
if (iv->mText[0] != 0 and ((iv->mText[0] != '.' and iv->mText[0] != '?') or iv->mText[1] != 0)) if (iv->mText[0] != 0 and ((iv->mText[0] != '.' and iv->mText[0] != '?') or iv->mText[1] != 0))
...@@ -268,6 +256,12 @@ const char* ItemReference::c_str(const char* defaultValue) const ...@@ -268,6 +256,12 @@ const char* ItemReference::c_str(const char* defaultValue) const
break; break;
} }
} }
if (result == defaultValue and mColumn < mRow->mCategory->mColumns.size()) // not found, perhaps the category has a default defined?
{
auto iv = mRow->mCategory->mColumns[mColumn].mValidator;
if (iv != nullptr and not iv->mDefault.empty())
result = iv->mDefault.c_str();
} }
} }
...@@ -281,7 +275,7 @@ bool ItemReference::empty() const ...@@ -281,7 +275,7 @@ bool ItemReference::empty() const
void ItemReference::swap(ItemReference& b) void ItemReference::swap(ItemReference& b)
{ {
Row::swap(mName, mRow, b.mRow); Row::swap(mColumn, mRow, b.mRow);
} }
} }
...@@ -1196,7 +1190,7 @@ size_t Category::addColumn(const string& name) ...@@ -1196,7 +1190,7 @@ size_t Category::addColumn(const string& name)
{ {
itemValidator = mCatValidator->getValidatorForItem(name); itemValidator = mCatValidator->getValidatorForItem(name);
if (itemValidator == nullptr) if (itemValidator == nullptr)
mValidator->reportError("tag " + name + " not allowed in Category " + mName); mValidator->reportError("tag " + name + " not allowed in Category " + mName, false);
} }
mColumns.push_back({name, itemValidator}); mColumns.push_back({name, itemValidator});
...@@ -1489,7 +1483,8 @@ void Category::getTagOrder(vector<string>& tags) const ...@@ -1489,7 +1483,8 @@ void Category::getTagOrder(vector<string>& tags) const
const detail::ItemReference Category::getFirstItem(const char* itemName) const const detail::ItemReference Category::getFirstItem(const char* itemName) const
{ {
return detail::ItemReference{itemName, mHead}; size_t column = getColumnIndex(itemName);
return detail::ItemReference{itemName, column, mHead};
} }
Category::iterator Category::begin() Category::iterator Category::begin()
...@@ -1518,7 +1513,7 @@ bool Category::isValid() ...@@ -1518,7 +1513,7 @@ bool Category::isValid()
if (mCatValidator == nullptr) if (mCatValidator == nullptr)
{ {
mValidator->reportError("undefined Category " + mName); mValidator->reportError("undefined Category " + mName, false);
return false; return false;
} }
...@@ -1529,7 +1524,7 @@ bool Category::isValid() ...@@ -1529,7 +1524,7 @@ bool Category::isValid()
auto iv = mCatValidator->getValidatorForItem(col.mName); auto iv = mCatValidator->getValidatorForItem(col.mName);
if (iv == nullptr) if (iv == nullptr)
{ {
mValidator->reportError("Field " + col.mName + " is not valid in Category " + mName); mValidator->reportError("Field " + col.mName + " is not valid in Category " + mName, false);
result = false; result = false;
} }
...@@ -1540,7 +1535,7 @@ bool Category::isValid() ...@@ -1540,7 +1535,7 @@ bool Category::isValid()
if (not mandatory.empty()) if (not mandatory.empty())
{ {
mValidator->reportError("In Category " + mName + " the following mandatory fields are missing: " + ba::join(mandatory, ", ")); mValidator->reportError("In Category " + mName + " the following mandatory fields are missing: " + ba::join(mandatory, ", "), false);
result = false; result = false;
} }
...@@ -1569,7 +1564,7 @@ bool Category::isValid() ...@@ -1569,7 +1564,7 @@ bool Category::isValid()
if (iv == nullptr) if (iv == nullptr)
{ {
mValidator->reportError("invalid field " + mColumns[cix].mName + " for Category " + mName); mValidator->reportError("invalid field " + mColumns[cix].mName + " for Category " + mName, false);
result = false; result = false;
continue; continue;
} }
...@@ -1588,7 +1583,7 @@ bool Category::isValid() ...@@ -1588,7 +1583,7 @@ bool Category::isValid()
if (iv != nullptr and iv->mMandatory) if (iv != nullptr and iv->mMandatory)
{ {
mValidator->reportError("missing mandatory field " + mColumns[cix].mName + " for Category " + mName); mValidator->reportError("missing mandatory field " + mColumns[cix].mName + " for Category " + mName, false);
result = false; result = false;
} }
} }
...@@ -1610,7 +1605,7 @@ iset Category::fields() const ...@@ -1610,7 +1605,7 @@ iset Category::fields() const
throw runtime_error("No Validator specified"); throw runtime_error("No Validator specified");
if (mCatValidator == nullptr) if (mCatValidator == nullptr)
mValidator->reportError("undefined Category"); mValidator->reportError("undefined Category", true);
iset result; iset result;
for (auto& iv: mCatValidator->mItemValidators) for (auto& iv: mCatValidator->mItemValidators)
...@@ -1624,7 +1619,7 @@ iset Category::mandatoryFields() const ...@@ -1624,7 +1619,7 @@ iset Category::mandatoryFields() const
throw runtime_error("No Validator specified"); throw runtime_error("No Validator specified");
if (mCatValidator == nullptr) if (mCatValidator == nullptr)
mValidator->reportError("undefined Category"); mValidator->reportError("undefined Category", true);
return mCatValidator->mMandatoryFields; return mCatValidator->mMandatoryFields;
} }
...@@ -1635,11 +1630,26 @@ iset Category::keyFields() const ...@@ -1635,11 +1630,26 @@ iset Category::keyFields() const
throw runtime_error("No Validator specified"); throw runtime_error("No Validator specified");
if (mCatValidator == nullptr) if (mCatValidator == nullptr)
mValidator->reportError("undefined Category"); mValidator->reportError("undefined Category", true);
return iset{ mCatValidator->mKeys.begin(), mCatValidator->mKeys.end() }; return iset{ mCatValidator->mKeys.begin(), mCatValidator->mKeys.end() };
} }
set<size_t> Category::keyFieldsByIndex() const
{
if (mValidator == nullptr)
throw runtime_error("No Validator specified");
if (mCatValidator == nullptr)
mValidator->reportError("undefined Category", true);
set<size_t> result;
for (auto& k: mCatValidator->mKeys)
result.insert(getColumnIndex(k));
return result;
}
auto Category::iterator::operator++() -> iterator& auto Category::iterator::operator++() -> iterator&
{ {
mCurrent = Row(mCurrent.data()->mNext); mCurrent = Row(mCurrent.data()->mNext);
...@@ -1901,12 +1911,24 @@ Row& Row::operator=(const Row& rhs) ...@@ -1901,12 +1911,24 @@ Row& Row::operator=(const Row& rhs)
void Row::assign(const string& name, const string& value, bool emplacing) void Row::assign(const string& name, const string& value, bool emplacing)
{ {
try
{
auto cat = mData->mCategory;
assign(cat->addColumn(name), value, emplacing);
}
catch (const exception& ex)
{
throw_with_nested(logic_error("Could not assigning value '" + value + "' to column " + name));
}
}
void Row::assign(size_t column, const string& value, bool emplacing)
{
if (mData == nullptr) if (mData == nullptr)
throw logic_error("invalid Row, no data assigning value '" + value + "' to " + name); throw logic_error("invalid Row, no data assigning value '" + value + "' to column with index " + to_string(column));
auto cat = mData->mCategory; auto cat = mData->mCategory;
auto cix = cat->addColumn(name); auto& col = cat->mColumns[column];
auto& col = cat->mColumns[cix];
auto& db = cat->mDb; auto& db = cat->mDb;
const char* oldValue = nullptr; const char* oldValue = nullptr;
...@@ -1914,7 +1936,7 @@ void Row::assign(const string& name, const string& value, bool emplacing) ...@@ -1914,7 +1936,7 @@ void Row::assign(const string& name, const string& value, bool emplacing)
{ {
assert(iv != iv->mNext and (iv->mNext == nullptr or iv != iv->mNext->mNext)); assert(iv != iv->mNext and (iv->mNext == nullptr or iv != iv->mNext->mNext));
if (iv->mColumnIndex == cix) if (iv->mColumnIndex == column)
{ {
oldValue = iv->mText; oldValue = iv->mText;
break; break;
...@@ -1936,7 +1958,7 @@ void Row::assign(const string& name, const string& value, bool emplacing) ...@@ -1936,7 +1958,7 @@ void Row::assign(const string& name, const string& value, bool emplacing)
bool reinsert = false; bool reinsert = false;
if (not emplacing and // an update of an Item's value if (not emplacing and // an update of an Item's value
cat->mIndex != nullptr and cat->keyFields().count(name)) cat->mIndex != nullptr and cat->keyFieldsByIndex().count(column))
{ {
reinsert = cat->mIndex->find(mData); reinsert = cat->mIndex->find(mData);
if (reinsert) if (reinsert)
...@@ -1947,7 +1969,7 @@ void Row::assign(const string& name, const string& value, bool emplacing) ...@@ -1947,7 +1969,7 @@ void Row::assign(const string& name, const string& value, bool emplacing)
if (mData->mValues == nullptr) if (mData->mValues == nullptr)
; // nothing to do ; // nothing to do
else if (mData->mValues->mColumnIndex == cix) else if (mData->mValues->mColumnIndex == column)
{ {
auto iv = mData->mValues; auto iv = mData->mValues;
mData->mValues = iv->mNext; mData->mValues = iv->mNext;
...@@ -1958,7 +1980,7 @@ void Row::assign(const string& name, const string& value, bool emplacing) ...@@ -1958,7 +1980,7 @@ void Row::assign(const string& name, const string& value, bool emplacing)
{ {
for (auto iv = mData->mValues; iv->mNext != nullptr; iv = iv->mNext) for (auto iv = mData->mValues; iv->mNext != nullptr; iv = iv->mNext)
{ {
if (iv->mNext->mColumnIndex == cix) if (iv->mNext->mColumnIndex == column)
{ {
auto nv = iv->mNext; auto nv = iv->mNext;
iv->mNext = nv->mNext; iv->mNext = nv->mNext;
...@@ -1972,7 +1994,7 @@ void Row::assign(const string& name, const string& value, bool emplacing) ...@@ -1972,7 +1994,7 @@ void Row::assign(const string& name, const string& value, bool emplacing)
if (not value.empty()) if (not value.empty())
{ {
auto nv = new(value.length()) ItemValue(value.c_str(), cix); auto nv = new(value.length()) ItemValue(value.c_str(), column);
if (mData->mValues == nullptr) if (mData->mValues == nullptr)
mData->mValues = nv; mData->mValues = nv;
...@@ -2012,7 +2034,7 @@ cerr << "fixing linked item " << child->mCategory->mName << '.' << child->mTag < ...@@ -2012,7 +2034,7 @@ cerr << "fixing linked item " << child->mCategory->mName << '.' << child->mTag <
} }
} }
void Row::swap(const string& name, ItemRow* a, ItemRow* b) void Row::swap(size_t cix, ItemRow* a, ItemRow* b)
{ {
if (a == nullptr or b == nullptr) if (a == nullptr or b == nullptr)
throw logic_error("invalid Rows in swap"); throw logic_error("invalid Rows in swap");
...@@ -2022,7 +2044,6 @@ void Row::swap(const string& name, ItemRow* a, ItemRow* b) ...@@ -2022,7 +2044,6 @@ void Row::swap(const string& name, ItemRow* a, ItemRow* b)
throw logic_error("Categories not same in swap"); throw logic_error("Categories not same in swap");
auto cat = a->mCategory; auto cat = a->mCategory;
auto cix = cat->addColumn(name);
auto& col = cat->mColumns[cix]; auto& col = cat->mColumns[cix];
auto& db = cat->mDb; auto& db = cat->mDb;
...@@ -2031,7 +2052,7 @@ void Row::swap(const string& name, ItemRow* a, ItemRow* b) ...@@ -2031,7 +2052,7 @@ void Row::swap(const string& name, ItemRow* a, ItemRow* b)
bool reinsert = false; bool reinsert = false;
if (cat->mIndex != nullptr and cat->keyFields().count(name)) if (cat->mIndex != nullptr and cat->keyFieldsByIndex().count(cix))
{ {
reinsert = true; reinsert = true;
cat->mIndex->erase(a); cat->mIndex->erase(a);
...@@ -2146,12 +2167,17 @@ cerr << "fixing linked item " << child->mCategory->mName << '.' << child->mTag < ...@@ -2146,12 +2167,17 @@ cerr << "fixing linked item " << child->mCategory->mName << '.' << child->mTag <
} }
} }
void Row::assign(const Item& value, bool emplacing) void Row::assign(const Item& value, bool emplacing)
{ {
assign(value.name(), value.value(), emplacing); assign(value.name(), value.value(), emplacing);
} }
size_t Row::ColumnForItemTag(const char* itemTag) const
{
auto cat = mData->mCategory;
return cat->getColumnIndex(itemTag);
}
bool Row::empty() const bool Row::empty() const
{ {
return mData == nullptr or mData->mValues == nullptr; return mData == nullptr or mData->mValues == nullptr;
......
...@@ -252,9 +252,9 @@ ValidateItem* Validator::getValidatorForItem(string tag) const ...@@ -252,9 +252,9 @@ ValidateItem* Validator::getValidatorForItem(string tag) const
return result; return result;
} }
void Validator::reportError(const string& msg) void Validator::reportError(const string& msg, bool fatal)
{ {
if (mStrict) if (mStrict or fatal)
throw ValidationError(msg); throw ValidationError(msg);
else if (VERBOSE) else if (VERBOSE)
cerr << msg << endl; cerr << msg << endl;
......
...@@ -153,8 +153,8 @@ const uint32 kHistogramSize = 30; ...@@ -153,8 +153,8 @@ const uint32 kHistogramSize = 30;
struct Res struct Res
{ {
Res(Monomer&& m) Res(const Monomer& m)
: mM(move(m)) : mM(m)
, mType(MapResidue(m.compoundID())) , mType(MapResidue(m.compoundID()))
{ {
for (auto& a: mM.atoms()) for (auto& a: mM.atoms())
...@@ -243,7 +243,7 @@ struct Res ...@@ -243,7 +243,7 @@ struct Res
Res* mNext = nullptr; Res* mNext = nullptr;
Res* mPrev = nullptr; Res* mPrev = nullptr;
Monomer mM; const Monomer& mM;
Point mCAlpha, mC, mN, mO, mH; Point mCAlpha, mC, mN, mO, mH;
...@@ -727,7 +727,7 @@ void CalculateAlphaHelices(vector<Res>& inResidues, bool inPreferPiHelices = tru ...@@ -727,7 +727,7 @@ void CalculateAlphaHelices(vector<Res>& inResidues, bool inPreferPiHelices = tru
void CalculateSecondaryStructure(Structure& s) void CalculateSecondaryStructure(Structure& s)
{ {
auto polymers = s.polymers(); auto& polymers = s.polymers();
size_t nRes = accumulate(polymers.begin(), polymers.end(), size_t nRes = accumulate(polymers.begin(), polymers.end(),
0.0, [](double s, auto& p) { return s + p.size(); }); 0.0, [](double s, auto& p) { return s + p.size(); });
...@@ -737,8 +737,8 @@ void CalculateSecondaryStructure(Structure& s) ...@@ -737,8 +737,8 @@ void CalculateSecondaryStructure(Structure& s)
for (auto& p: polymers) for (auto& p: polymers)
{ {
for (auto m: p) for (auto& m: p)
residues.emplace_back(move(m)); residues.emplace_back(m);
} }
for (size_t i = 0; i + 1 < residues.size(); ++i) for (size_t i = 0; i + 1 < residues.size(); ++i)
...@@ -773,7 +773,7 @@ struct DSSPImpl ...@@ -773,7 +773,7 @@ struct DSSPImpl
DSSPImpl(const Structure& s); DSSPImpl(const Structure& s);
const Structure& mStructure; const Structure& mStructure;
vector<Polymer> mPolymers; const vector<Polymer>& mPolymers;
vector<Res> mResidues; vector<Res> mResidues;
}; };
...@@ -826,8 +826,8 @@ auto start = std::chrono::system_clock::now(); ...@@ -826,8 +826,8 @@ auto start = std::chrono::system_clock::now();
for (auto& p: mPolymers) for (auto& p: mPolymers)
{ {
for (auto m: p) for (auto& m: p)
mResidues.emplace_back(move(m)); mResidues.emplace_back(m);
} }
auto end = std::chrono::system_clock::now(); auto end = std::chrono::system_clock::now();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment