1 /*
2 This file is part of Freeminer.
3
4 Freeminer is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 Freeminer is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with Freeminer. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include "circuit_element_virtual.h"
19 #include "circuit_element.h"
20 #include "debug.h"
21
CircuitElementVirtual(u32 id)22 CircuitElementVirtual::CircuitElementVirtual(u32 id) : m_state(false) {
23 m_element_id = id;
24 }
25
~CircuitElementVirtual()26 CircuitElementVirtual::~CircuitElementVirtual() {
27 for(std::list <CircuitElementVirtualContainer>::iterator i = this->begin();
28 i != this->end(); ++i) {
29 i->element_pointer->disconnectFace(i->shift);
30 }
31 }
32
update()33 void CircuitElementVirtual::update() {
34 if(m_state) {
35 for(std::list <CircuitElementVirtualContainer>::iterator i = this->begin();
36 i != this->end(); ++i) {
37 i->element_pointer->addState(SHIFT_TO_FACE(i->shift));
38 }
39 m_state = false;
40 }
41 }
42
serialize(std::ostream & out)43 void CircuitElementVirtual::serialize(std::ostream& out) {
44 u32 connections_num = this->size();
45 out.write(reinterpret_cast<char*>(&connections_num), sizeof(connections_num));
46 for(std::list <CircuitElementVirtualContainer>::iterator i = this->begin();
47 i != this->end(); ++i) {
48 u32 element_id = i->element_pointer->getId();
49 u8 shift = i->shift;
50 out.write(reinterpret_cast<char*>(&element_id), sizeof(element_id));
51 out.write(reinterpret_cast<char*>(&shift), sizeof(shift));
52 }
53 }
54
deSerialize(std::istream & in,std::list<CircuitElementVirtual>::iterator current_element_it,std::map<u32,std::list<CircuitElement>::iterator> & id_to_pointer)55 void CircuitElementVirtual::deSerialize(std::istream& in, std::list <CircuitElementVirtual>::iterator current_element_it,
56 std::map <u32, std::list <CircuitElement>::iterator>& id_to_pointer) {
57 u32 connections_num;
58 in.read(reinterpret_cast<char*>(&connections_num), sizeof(connections_num));
59 for(u32 i = 0; i < connections_num; ++i) {
60 u32 element_id;
61 CircuitElementVirtualContainer tmp_container;
62 in.read(reinterpret_cast<char*>(&element_id), sizeof(element_id));
63 in.read(reinterpret_cast<char*>(&(tmp_container.shift)), sizeof(tmp_container.shift));
64 tmp_container.element_pointer = id_to_pointer[element_id];
65 std::list <CircuitElementVirtualContainer>::iterator it = this->insert(this->begin(), tmp_container);
66 it->element_pointer->connectFace(it->shift, it, current_element_it);
67 }
68 }
69
setId(u32 id)70 void CircuitElementVirtual::setId(u32 id) {
71 m_element_id = id;
72 }
73
getId()74 u32 CircuitElementVirtual::getId() {
75 return m_element_id;
76 }
77