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