File indexing completed on 2024-04-28 03:40:47
0001 /************************************************************************************* 0002 * Copyright (C) 2009 by Aleix Pol <aleixpol@kde.org> * 0003 * * 0004 * This program is free software; you can redistribute it and/or * 0005 * modify it under the terms of the GNU General Public License * 0006 * as published by the Free Software Foundation; either version 2 * 0007 * of the License, or (at your option) any later version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, * 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0012 * GNU General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU General Public License * 0015 * along with this program; if not, write to the Free Software * 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 0017 *************************************************************************************/ 0018 0019 #ifndef VECTOR_H 0020 #define VECTOR_H 0021 0022 #include "object.h" 0023 #include "analitzaexport.h" 0024 0025 namespace Analitza 0026 { 0027 0028 class Cn; 0029 0030 /** 0031 * \class Vector 0032 * 0033 * \ingroup AnalitzaModule 0034 */ 0035 0036 class ANALITZA_EXPORT Vector : public Object 0037 { 0038 public: 0039 typedef QList<Object*>::iterator iterator; 0040 typedef QList<Object*>::const_iterator const_iterator; 0041 0042 Vector(const Vector& v); 0043 explicit Vector(int size); 0044 /** Fills the vector with a fixed numeric @p value */ 0045 Vector(int size, const Cn *value); 0046 ~Vector() override; 0047 0048 void appendBranch(Object* ); 0049 int size() const { return m_elements.size(); } 0050 0051 iterator erase(const iterator& it) { return m_elements.erase(it); } 0052 0053 iterator begin() { return m_elements.begin(); } 0054 iterator end() { return m_elements.end(); } 0055 const_iterator constBegin() const { return m_elements.constBegin(); } 0056 const_iterator constEnd() const { return m_elements.constEnd(); } 0057 0058 Object* at(int i) const { return m_elements[i]; } 0059 void setAt(int i, Object* o) { m_elements[i]=o; } 0060 QList<Object*> values() const { return m_elements; } 0061 0062 virtual QVariant accept(AbstractExpressionVisitor* e) const override; 0063 virtual bool isZero() const override; 0064 0065 virtual bool matches(const Object* pattern, QMap< QString, const Object* >* found) const override; 0066 Vector* copy() const override; 0067 bool operator==(const Vector& v) const; 0068 bool hasOnlyNumbers() const { return m_elements.isEmpty()? false : m_hasOnlyNumbers; } 0069 bool isStandardBasisVector() const; 0070 bool isDiagonalRow() const { return m_elements.isEmpty()? false : m_isDiagonalRowVector; } 0071 0072 protected: 0073 Vector(Analitza::Object::ObjectType t, int size); 0074 0075 private: 0076 QList<Object*> m_elements; 0077 bool m_hasOnlyNumbers; 0078 bool m_nonZeroTaken; 0079 bool m_isDiagonalRowVector; 0080 short int m_nonZeros; 0081 }; 0082 0083 } 0084 0085 #endif // VECTOR_H