/* * Expression.h: interface for the CExpression class. * $Id: Expression.h 29259 2010-06-06 01:15:44Z campbellbarton $ * Copyright (c) 1996-2000 Erwin Coumans * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Erwin Coumans makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * */ #if !defined _EXPRESSION_H #define _EXPRESSION_H #include "Value.h" //extern int gRefCountExpr; // only for debugging purposes (detect mem.leaks) #define PLUGIN_DECLARE_SERIAL_EXPRESSION(class_name,base_class_name) \ public: \ virtual base_class_name * Copy() { return new class_name; } \ virtual bool EdSerialize(CompressorArchive& arch,class CFactoryManager* facmgr,bool bIsStoring); \ virtual bool EdIdSerialize(CompressorArchive& arch,class CFactoryManager* facmgr,bool bIsStoring) \ { \ if (bIsStoring) \ { \ unsigned char exprID = GetExpressionID(); \ arch << exprID; \ } \ return true; \ } \ class CExpression; // for undo/redo system the deletion in the expressiontree can be restored by replacing broken links 'inplace' class CBrokenLinkInfo { public: CBrokenLinkInfo(CExpression** pmemexpr,CExpression* expr) :m_pmemExpr(pmemexpr), m_pExpr(expr) { assertd(pmemexpr); m_bRestored=false; }; virtual ~CBrokenLinkInfo(); void RestoreLink(); void BreakLink(); // members vars private: CExpression** m_pmemExpr; CExpression* m_pExpr; bool m_bRestored; #ifdef WITH_CXX_GUARDEDALLOC public: void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CBrokenLinkInfo"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; class CExpression { public: enum { COPERATOR1EXPRESSIONID = 1, COPERATOR2EXPRESSIONID = 2, CCONSTEXPRESSIONID = 3, CIFEXPRESSIONID = 4, COPERATORVAREXPRESSIONID = 5, CIDENTIFIEREXPRESSIONID = 6 }; protected: virtual ~CExpression() = 0; //pure virtual public: virtual bool MergeExpression(CExpression* otherexpr) = 0; CExpression(); virtual CValue* Calculate() = 0; //pure virtual virtual unsigned char GetExpressionID() = 0; //virtual bool IsInside(float x,float y,float z,bool bBorderInclude=true) = 0; //pure virtual virtual bool NeedsRecalculated() = 0; // another pure one virtual CExpression * CheckLink(std::vector& brokenlinks) =0; // another pure one virtual void ClearModified() = 0; // another pure one //virtual CExpression * Copy() =0; virtual void BroadcastOperators(VALUE_OPERATOR op) =0; virtual CExpression * AddRef() { // please leave multiline, for debugger !!! #ifdef _DEBUG //gRefCountExpr++; assertd(m_refcount < 255); #endif m_refcount++; return this; }; virtual CExpression* Release(CExpression* complicatedtrick=NULL) { #ifdef _DEBUG //gRefCountExpr--; #endif if (--m_refcount < 1) { delete this; } //else // return this; return complicatedtrick; }; protected: int m_refcount; #ifdef WITH_CXX_GUARDEDALLOC public: void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CExpression"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; #endif // !defined _EXPRESSION_H