FunctionalGateInstructionVisitor.hpp 3.32 KB
Newer Older
1
/***********************************************************************************
2
 * Copyright (c) 2017, UT-Battelle
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   * Neither the name of the xacc nor the
 *     names of its contributors may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Contributors:
 *   Initial API and implementation - Alex McCaskey
 *
 **********************************************************************************/
31
32
#ifndef FUNCTIONALGATEINSTRUCTIONVISITOR_HPP_
#define FUNCTIONALGATEINSTRUCTIONVISITOR_HPP_
33

34
#include "AllGateVisitor.hpp"
35

36
using namespace xacc;
37
38
39
40

namespace xacc {
namespace quantum {

41
class FunctionalGateInstructionVisitor: public AllGateVisitor {
42
43
44
45
protected:
	std::function<void(Hadamard&)> hAction;
	std::function<void(CNOT&)> cnotAction;
	std::function<void(X&)> xAction;
46
	std::function<void(Y&)> yAction;
47
48
49
	std::function<void(Z&)> zAction;
	std::function<void(Measure&)> measureAction;
	std::function<void(ConditionalFunction&)> condAction;
50
51
	std::function<void(Rx&)> rxAction;
	std::function<void(Ry&)> ryAction;
52
	std::function<void(Rz&)> rzAction;
53
54

public:
55
56
57
58
59
	template<typename HF, typename CNF, typename XF,  typename YF, typename ZF,
			typename RXF, typename RYF, typename RZF, typename MF, typename CF>
	FunctionalGateInstructionVisitor(HF h, CNF cn, XF x, YF y, ZF z, RXF rx, RYF ry, RZF rz, MF m, CF c) :
			hAction(h), cnotAction(cn), xAction(x), yAction(y), zAction(z), measureAction(
					m), condAction(c), rxAction(rx), ryAction(ry), rzAction(rz) {
60
61
	}

62
63
64
65
66
67
68
69
70
	void visit(Hadamard& h) {
		hAction(h);
	}
	void visit(CNOT& cn) {
		cnotAction(cn);
	}
	void visit(X& x) {
		xAction(x);
	}
71
72
73
74
75

	void visit(Y& y) {
		yAction(y);
	}

76
77
78
79
80
81
82
83
84
	void visit(Z& z) {
		zAction(z);
	}
	void visit(Measure& m) {
		measureAction(m);
	}
	void visit(ConditionalFunction& c) {
		condAction(c);
	}
85

86
87
88
89
90
91
92
	void visit(Rx& rx) {
		rxAction(rx);
	}
	void visit(Ry& ry) {
		ryAction(ry);
	}

93
94
95
96
	void visit(Rz& rz) {
		rzAction(rz);
	}

97
98
99
	void visit(GateFunction& f) {
		return;
	}
100
101
	virtual ~FunctionalGateInstructionVisitor() {}
};
102

103
104
}
}
105
106
107
108
109




#endif