OSDN Git Service

[dennco] integrated engine related changes from denncoCreator
[dennco/dennco.git] / Source / TKCell.cpp
1 //  Copyright (c) 2012 Dennco Project
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 //
17 //  Created by tkawata on 12/11/2011.
18 //
19
20 #include "TKCell.h"
21 #include "TKReceptor.h"
22 #include "TKContainer.h"
23 #include "TKCellCode.h"
24 #include "TKAxon.h"
25 #include "TKCellCodeInstance.h"
26 #include "TKLog.h"
27 #include <string>
28
29 TKCell::TKCell(TKContainer *container, std::string location, std::string name, bool canIntarface)
30 : mName(name), mLocation(location), mContainer(container), mAxon(NULL), mCellCodeInstance(NULL), mCanInterface(canIntarface)
31 {
32 }
33
34 TKCell::~TKCell()
35 {
36     if (mCellCodeInstance)
37     {
38         delete mCellCodeInstance;
39         mCellCodeInstance = NULL;
40     }
41
42     for ( TKReceptorMap::iterator it = mReceptors.begin(); it != mReceptors.end(); ++it ) {
43         delete it->second;
44     }
45     mReceptors.clear();
46
47     if (mAxon)
48     {
49         delete mAxon;
50         mAxon = NULL;
51     }
52 }
53
54 void TKCell::init()
55 {
56     if (!mAxon)
57         mAxon = mContainer->axonFactory(this);
58 }
59
60 float TKCell::getAxonValue() const
61 {
62     if (!mAxon)
63         return 0.0;
64     return mAxon->getValue();
65 }
66
67 void  TKCell::setAxonValue(float value)
68 {
69     if (!mAxon)
70         return;
71     mAxon->setValue(value);
72 }
73
74 bool TKCell::setCellCode(TKCellCode *code, const void *data)
75 {
76     if (mCellCodeInstance)
77         delete mCellCodeInstance;
78
79     mCellCodeInstance = code->createCellCodeInstance(this, data);
80     return mCellCodeInstance != NULL;
81 }
82
83 bool TKCell::connectTo(std::string connectionName, TKCell *targetCell)
84 {
85     TKReceptor *receptor = targetCell->createReceptor(connectionName);
86     if (receptor)
87     {
88         TKAxonTerminal *terminal = mAxon->addTerminal();
89         receptor->setTarget(terminal);
90
91         return true;
92     }
93     else
94     {
95         return false;
96     }
97 }
98
99 TKReceptor* TKCell::createReceptor(std::string name)
100 {
101     TKReceptor *receptor;
102     TKReceptorMap::iterator it = mReceptors.find(name);
103     if (it != mReceptors.end())
104     {
105         receptor = NULL;
106     }
107     else
108     {
109         receptor = mContainer->receptorFactory(this);
110         if (receptor)
111         {
112             mReceptors.insert( TKReceptorMap::value_type( name, receptor ) );
113         }
114     }
115
116     return receptor;
117 }
118