blob: 4c02ecd89c13db572f4d3fb470c9f195b2b371a6 [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;"
Brian Silverman203a0fc2015-03-16 15:21:00 -070088 elsif elem.respond_to?(:length) && elem.member_type.respond_to?(:create_EqualsNoTime)
89 0.upto(elem.length - 1) do |i|
90 member_func.suite << "if (!other.#{elem.name}[#{i}].EqualsNoTime(#{elem.name}[#{i}])) return false;"
91 end
Brian Silverman88457ef2015-02-23 01:56:10 -050092 else
Brian Silverman88457ef2015-02-23 01:56:10 -050093 member_func.suite << "if (other.#{elem.name} != #{elem.name}) return false;"
94 end
95 end
96 member_func.suite << CPP::Return.new('true')
97 end
98 def type_name(cpp_tree)
99 type = cpp_tree.get(@type)
100 if(@type.loc == @loc) #use relative name
101 return type.name
102 else #use full name
103 return @type.loc.to_cpp_id(type.name)
104 end
105 end
106 def size()
107 return @type.size()
108 end
109 def toPrintFormat()
110 @type.getPrintFormat()
111 end
112 def create_usage(cpp_tree, this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700113 if (this_name == nil)
114 this_name = @name
115 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500116 return "#{type_name(cpp_tree)} #{this_name}"
117 end
118 def add_TypeRegister(cpp_tree, o_type, member_func)
119 type = cpp_tree.get(@type)
120 tName = @type.loc.to_cpp_id(type.name)
121 member_func.suite << "#{tName}::GetType()"
122 end
123 def fetchPrintArgs(args, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700124 if (this_name == nil)
125 this_name = @name
126 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500127 @type.fetchPrintArgs(args, parent + "#{this_name}.")
128 end
129 def toNetwork(offset,suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700130 if (this_name == nil)
131 this_name = @name
132 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500133 @type.toNetwork(offset, suite, parent + "#{this_name}.")
134 end
135 def toHost(offset,suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700136 if (this_name == nil)
137 this_name = @name
138 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500139 @type.toHost(offset, suite, parent + "#{this_name}.")
140 end
141 def set_message_builder(suite, this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700142 if (this_name == nil)
143 this_name = @name
144 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500145 suite << "msg_ptr_->#{this_name} = #{this_name}"
146 end
Parker Schuh343481e2014-02-09 18:28:43 -0800147
Brian Silverman88457ef2015-02-23 01:56:10 -0500148 def zeroCall(suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700149 if (this_name == nil)
150 this_name = @name
151 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500152 @type.zeroCall(suite, parent + "#{this_name}.")
153 end
154 def simpleStr()
155 "#{@type.simpleStr()} #{@name}"
156 end
157 def getTypeID()
158 return @type.getTypeID()
159 end
Parker Schuh343481e2014-02-09 18:28:43 -0800160end