]> git.lyx.org Git - lyx.git/blobdiff - src/InsetList.cpp
avoid float-conversion warning and simplify size computation
[lyx.git] / src / InsetList.cpp
index 27e59280f31b6673846fdbfbf3fb455441029368..56401a4ba6d37112c555174a5da44e487c482702 100644 (file)
@@ -3,36 +3,36 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author Martin Vermeer
  *
  * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
+#include <algorithm>
 
 #include "InsetList.h"
 
 #include "Buffer.h"
 #include "BufferParams.h"
 #include "BranchList.h"
-#include "debug.h"
 
 #include "insets/InsetBranch.h"
 
+#include "support/debug.h"
 
-namespace lyx {
+using namespace std;
 
-using std::endl;
-using std::lower_bound;
+namespace lyx {
 
 
 namespace {
 
 typedef InsetList::InsetTable Table;
 
-class InsetTablePosLess : public std::binary_function<Table, Table, bool> {
-public:
+struct InsetTablePosLess
+{
        bool operator()(Table const & t1, Table const & t2) const
        {
                return t1.pos < t2.pos;
@@ -42,16 +42,46 @@ public:
 } // namespace anon
 
 
+InsetList::InsetList(InsetList const & il)
+{
+       list_ = il.list_;
+       List::iterator it = list_.begin();
+       List::iterator end = list_.end();
+       for (; it != end; ++it)
+               it->inset = it->inset->clone();
+}
+
+
+InsetList::InsetList(InsetList const & il, pos_type beg, pos_type end)
+{
+       InsetList::const_iterator cit = il.begin();
+       InsetList::const_iterator cend = il.end();
+       for (; cit != cend; ++cit) {
+               if (cit->pos < beg)
+                       continue;
+               if (cit->pos >= end)
+                       break;
+               // Add a new entry in the insetlist_.
+               insert(cit->inset->clone(), cit->pos - beg);
+       }
+}
+
 
 InsetList::~InsetList()
 {
-       // If we begin storing a shared_ptr in the List
-       // this code can be removed. (Lgb)
        List::iterator it = list_.begin();
        List::iterator end = list_.end();
-       for (; it != end; ++it) {
+       for (; it != end; ++it)
                delete it->inset;
-       }
+}
+
+
+void InsetList::setBuffer(Buffer & b)
+{
+       List::iterator it = list_.begin();
+       List::iterator end = list_.end();
+       for (; it != end; ++it)
+               it->inset->setBuffer(b);
 }
 
 
@@ -71,13 +101,13 @@ InsetList::const_iterator InsetList::insetIterator(pos_type pos) const
 }
 
 
-void InsetList::insert(InsetBase * inset, pos_type pos)
+void InsetList::insert(Inset * inset, pos_type pos)
 {
        List::iterator end = list_.end();
        List::iterator it = insetIterator(pos);
        if (it != end && it->pos == pos) {
-               lyxerr << "ERROR (InsetList::insert): "
-                      << "There is an inset in position: " << pos << endl;
+               LYXERR0("ERROR (InsetList::insert): "
+                      << "There is an inset in position: " << pos);
        } else {
                list_.insert(it, InsetTable(pos, inset));
        }
@@ -95,12 +125,12 @@ void InsetList::erase(pos_type pos)
 }
 
 
-InsetBase * InsetList::release(pos_type pos)
+Inset * InsetList::release(pos_type pos)
 {
        List::iterator end = list_.end();
        List::iterator it = insetIterator(pos);
        if (it != end && it->pos == pos) {
-               InsetBase * tmp = it->inset;
+               Inset * tmp = it->inset;
                it->inset = 0;
                return tmp;
        }
@@ -108,7 +138,7 @@ InsetBase * InsetList::release(pos_type pos)
 }
 
 
-InsetBase * InsetList::get(pos_type pos) const
+Inset * InsetList::get(pos_type pos) const
 {
        List::const_iterator end = list_.end();
        List::const_iterator it = insetIterator(pos);
@@ -122,9 +152,8 @@ void InsetList::increasePosAfterPos(pos_type pos)
 {
        List::iterator end = list_.end();
        List::iterator it = insetIterator(pos);
-       for (; it != end; ++it) {
+       for (; it != end; ++it)
                ++it->pos;
-       }
 }
 
 
@@ -132,10 +161,33 @@ void InsetList::decreasePosAfterPos(pos_type pos)
 {
        List::iterator end = list_.end();
        List::iterator it = insetIterator(pos);
-       for (; it != end; ++it) {
+       for (; it != end; ++it)
                --it->pos;
+}
+
+
+pos_type InsetList::find(InsetCode code, pos_type startpos) const
+{
+       List::const_iterator it = insetIterator(startpos);
+       List::const_iterator end = list_.end();
+       for (; it != end ; ++it) {
+               if (it->inset->lyxCode() == code)
+                       return it->pos;
        }
+       return -1;
 }
 
 
+int InsetList::count(InsetCode code, pos_type startpos) const
+{
+       int num = 0;
+       List::const_iterator it = insetIterator(startpos);
+       List::const_iterator end = list_.end();
+       for (; it != end ; ++it) {
+               if (it->inset->lyxCode() == code)
+                       ++num;
+       }
+       return num;
+}
+
 } // namespace lyx