blob: 8e2e811a982a66231b76e63082445bc42ffc5ff8 [file] [log] [blame]
Parker Schuh711db3e2014-02-12 09:47:34 -08001class Target::StructDec < Target::StructBase
Brian Silverman88457ef2015-02-23 01:56:10 -05002 attr_accessor :name,:loc,:parent, :extern
3 def initialize(name)
4 @name = name
5 @members = []
6 end
7 def add_member(member)
8 @members << member
9 end
10 def create_GetType(type_class, cpp_tree)
11 member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","GetType")
12 type_class.add_member(member_func)
13 member_func.static = true
14 member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
15 member_func.suite << CPP::Return.new("getter.Get()")
16 end
17 def create(cpp_tree)
18 return self if(@extern)
19 orig_namespace = namespace = cpp_tree.get(@loc)
20 name = ""
21 if(namespace.class < Types::Type) #is nested
22 name = namespace.name + "_" + name
23 namespace = namespace.space
24 end
25 type_class = namespace.add_struct(name + @name)
Parker Schuh343481e2014-02-09 18:28:43 -080026
Brian Silverman88457ef2015-02-23 01:56:10 -050027 @members.each do |elem|
28 type_class.add_member(elem.create_usage(cpp_tree))
29 end
30 create_DoGetType(type_class, cpp_tree)
31 create_GetType(type_class, cpp_tree)
Brian Silverman16c82972014-02-13 15:36:40 -080032 create_DefaultConstructor(type_class, cpp_tree)
33 create_InOrderConstructor(type_class, cpp_tree)
34 create_Zero(type_class, cpp_tree)
35 create_Size(type_class, cpp_tree)
36 create_Serialize(type_class, cpp_tree)
37 create_Deserialize(type_class, cpp_tree)
Brian Silverman88457ef2015-02-23 01:56:10 -050038 create_EqualsNoTime(type_class, cpp_tree)
39 return type_class
40 end
41 def getPrintFormat()
42 return "{" + @members.collect { |elem| elem.toPrintFormat() }.join(", ") + "}"
43 end
44 def fetchPrintArgs(args, parent = "")
45 @members.each do |elem|
46 elem.fetchPrintArgs(args, parent)
47 end
48 end
49 def toHost(offset, suite, parent)
50 @members.each do |elem|
51 elem.toHost(offset, suite, parent)
52 offset += " + #{elem.size()}"
53 end
54 end
55 def toNetwork(offset, suite, parent)
56 @members.each do |elem|
57 elem.toNetwork(offset, suite, parent)
58 offset += " + #{elem.size()}"
59 end
60 end
61 def zeroCall(suite, parent)
62 @members.each do |elem|
63 elem.zeroCall(suite, parent)
64 end
65 end
Parker Schuh343481e2014-02-09 18:28:43 -080066end
67class Target::MessageStructElement < Target::Node
Brian Silverman88457ef2015-02-23 01:56:10 -050068 attr_accessor :name,:loc
69 def initialize(type,name)
70 @type, @name = type, name
71 end
72 def type()
73 return @type.get_name
74 end
75 def create_EqualsNoTime(type_class,cpp_tree)
76 member_func = CPP::MemberFunc.new(type_class,"bool","EqualsNoTime")
77 member_func.const = true
78 type_class.add_member(member_func)
79 if @members.empty?
80 member_func.args << "const #{type_class.name} &/*other*/"
81 else
82 member_func.args << "const #{type_class.name} &other"
83 end
84 member_func.suite << "if (!#{type_class.parent_class}::EqualsNoTime(other)) return false;" if type_class.parent_class
85 @members.each do |elem|
86 if elem.respond_to? :create_EqualsNoTime
87 member_func.suite << "if (!other.#{elem.name}.EqualsNoTime(#{elem.name})) return false;"
88 else
89 puts elem.class.to_s + ' ' + elem.name.to_s
90 member_func.suite << "if (other.#{elem.name} != #{elem.name}) return false;"
91 end
92 end
93 member_func.suite << CPP::Return.new('true')
94 end
95 def type_name(cpp_tree)
96 type = cpp_tree.get(@type)
97 if(@type.loc == @loc) #use relative name
98 return type.name
99 else #use full name
100 return @type.loc.to_cpp_id(type.name)
101 end
102 end
103 def size()
104 return @type.size()
105 end
106 def toPrintFormat()
107 @type.getPrintFormat()
108 end
109 def create_usage(cpp_tree, this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700110 if (this_name == nil)
111 this_name = @name
112 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500113 return "#{type_name(cpp_tree)} #{this_name}"
114 end
115 def add_TypeRegister(cpp_tree, o_type, member_func)
116 type = cpp_tree.get(@type)
117 tName = @type.loc.to_cpp_id(type.name)
118 member_func.suite << "#{tName}::GetType()"
119 end
120 def fetchPrintArgs(args, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700121 if (this_name == nil)
122 this_name = @name
123 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500124 @type.fetchPrintArgs(args, parent + "#{this_name}.")
125 end
126 def toNetwork(offset,suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700127 if (this_name == nil)
128 this_name = @name
129 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500130 @type.toNetwork(offset, suite, parent + "#{this_name}.")
131 end
132 def toHost(offset,suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700133 if (this_name == nil)
134 this_name = @name
135 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500136 @type.toHost(offset, suite, parent + "#{this_name}.")
137 end
138 def set_message_builder(suite, this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700139 if (this_name == nil)
140 this_name = @name
141 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500142 suite << "msg_ptr_->#{this_name} = #{this_name}"
143 end
Parker Schuh343481e2014-02-09 18:28:43 -0800144
Brian Silverman88457ef2015-02-23 01:56:10 -0500145 def zeroCall(suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700146 if (this_name == nil)
147 this_name = @name
148 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500149 @type.zeroCall(suite, parent + "#{this_name}.")
150 end
151 def simpleStr()
152 "#{@type.simpleStr()} #{@name}"
153 end
154 def getTypeID()
155 return @type.getTypeID()
156 end
Parker Schuh343481e2014-02-09 18:28:43 -0800157end