00001
00002 #ifndef __NODES_H__
00003 #define __NODES_H__
00004
00005 #include <vector>
00006 #include <algorithm>
00007 #include <utility>
00008 #include <map>
00009 #include <string>
00010
00011 namespace mgf {
00012
00013 namespace detail {
00014
00015 struct Node
00016 {
00017 virtual ~Node() {}
00018 };
00019
00020 struct DoublePairNode : public Node
00021 {
00022 typedef std::pair<double, double> value_type;
00023 explicit DoublePairNode(double mz, double ab) : Node(), value_(std::make_pair(mz, ab)) {}
00024 explicit DoublePairNode(double mz) : Node(), value_(std::make_pair(mz, 0.0)) {}
00025 value_type value_;
00026 };
00027
00028 struct DoublePairListNode : public Node
00029 {
00030 typedef std::vector<DoublePairNode::value_type> value_type;
00031 explicit DoublePairListNode(DoublePairNode* dpn) : Node() {
00032
00033 pairlist_ = new std::vector<DoublePairNode::value_type>;
00034 pairlist_->push_back(dpn->value_);
00035 delete dpn;
00036 }
00037 explicit DoublePairListNode(DoublePairListNode* dpns, DoublePairNode* dpn)
00038 : Node() {
00039
00040 pairlist_ = dpns->pairlist_;
00041 dpns->pairlist_ = 0;
00042 delete dpns;
00043
00044 pairlist_->push_back(dpn->value_);
00045 delete dpn;
00046 }
00047 virtual ~DoublePairListNode() {
00048 if (pairlist_) delete pairlist_;
00049 }
00050
00051 std::vector<DoublePairNode::value_type>* pairlist_;
00052 };
00053
00054
00055 struct IntegerNode : public Node
00056 {
00057 explicit IntegerNode(int i) : Node(), i_(i) {}
00058 int i_;
00059 };
00060
00061 struct IntegerListNode : public Node
00062 {
00063 explicit IntegerListNode(int i) : Node() {
00064 integers_ = new std::vector<int>;
00065 integers_->push_back(i);
00066 }
00067 explicit IntegerListNode(IntegerNode* node) : Node() {
00068 integers_ = new std::vector<int>;
00069 integers_->push_back(node->i_);
00070 delete node;
00071 }
00072 explicit IntegerListNode(IntegerListNode* integers) : Node() {
00073 integers_ = integers->integers_;
00074 integers->integers_ = 0;
00075 delete integers;
00076 }
00077 explicit IntegerListNode(IntegerListNode* integers, IntegerNode* integer)
00078 : Node() {
00079 integers_ = integers->integers_;
00080 integers->integers_ = 0;
00081 delete integers;
00082 integers_->push_back(integer->i_);
00083 delete integer;
00084 }
00085 explicit IntegerListNode(IntegerListNode* integers, int integer) : Node() {
00086 integers_ = integers->integers_;
00087 integers->integers_ = 0;
00088 delete integers;
00089 integers_->push_back(integer);
00090 }
00091 ~IntegerListNode() {
00092 if (integers_) delete integers_;
00093 }
00094 std::vector<int>* integers_;
00095 };
00096
00097 }
00098
00099 }
00100
00101 #endif // __NODES_H__