blob: f538bb3a0b1b44f30221ce6c85e22b98cd9314e6 [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)
Comran Morshed7eaf55b2015-08-01 15:03:13 +000079 member_func.args << "const #{type_class.name} &other"
Brian Silverman88457ef2015-02-23 01:56:10 -050080 member_func.suite << "if (!#{type_class.parent_class}::EqualsNoTime(other)) return false;" if type_class.parent_class
81 @members.each do |elem|
82 if elem.respond_to? :create_EqualsNoTime
83 member_func.suite << "if (!other.#{elem.name}.EqualsNoTime(#{elem.name})) return false;"
Brian Silverman203a0fc2015-03-16 15:21:00 -070084 elsif elem.respond_to?(:length) && elem.member_type.respond_to?(:create_EqualsNoTime)
85 0.upto(elem.length - 1) do |i|
86 member_func.suite << "if (!other.#{elem.name}[#{i}].EqualsNoTime(#{elem.name}[#{i}])) return false;"
87 end
Brian Silverman88457ef2015-02-23 01:56:10 -050088 else
Brian Silverman88457ef2015-02-23 01:56:10 -050089 member_func.suite << "if (other.#{elem.name} != #{elem.name}) return false;"
90 end
91 end
92 member_func.suite << CPP::Return.new('true')
93 end
94 def type_name(cpp_tree)
95 type = cpp_tree.get(@type)
96 if(@type.loc == @loc) #use relative name
97 return type.name
98 else #use full name
99 return @type.loc.to_cpp_id(type.name)
100 end
101 end
102 def size()
103 return @type.size()
104 end
105 def toPrintFormat()
106 @type.getPrintFormat()
107 end
108 def create_usage(cpp_tree, this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700109 if (this_name == nil)
110 this_name = @name
111 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500112 return "#{type_name(cpp_tree)} #{this_name}"
113 end
114 def add_TypeRegister(cpp_tree, o_type, member_func)
115 type = cpp_tree.get(@type)
116 tName = @type.loc.to_cpp_id(type.name)
117 member_func.suite << "#{tName}::GetType()"
118 end
119 def fetchPrintArgs(args, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700120 if (this_name == nil)
121 this_name = @name
122 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500123 @type.fetchPrintArgs(args, parent + "#{this_name}.")
124 end
125 def toNetwork(offset,suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700126 if (this_name == nil)
127 this_name = @name
128 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500129 @type.toNetwork(offset, suite, parent + "#{this_name}.")
130 end
131 def toHost(offset,suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700132 if (this_name == nil)
133 this_name = @name
134 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500135 @type.toHost(offset, suite, parent + "#{this_name}.")
136 end
137 def set_message_builder(suite, this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700138 if (this_name == nil)
139 this_name = @name
140 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500141 suite << "msg_ptr_->#{this_name} = #{this_name}"
142 end
Parker Schuh343481e2014-02-09 18:28:43 -0800143
Brian Silverman88457ef2015-02-23 01:56:10 -0500144 def zeroCall(suite, parent = "", this_name=nil)
Austin Schuh7e958392014-10-21 22:16:23 -0700145 if (this_name == nil)
146 this_name = @name
147 end
Brian Silverman88457ef2015-02-23 01:56:10 -0500148 @type.zeroCall(suite, parent + "#{this_name}.")
149 end
150 def simpleStr()
151 "#{@type.simpleStr()} #{@name}"
152 end
153 def getTypeID()
154 return @type.getTypeID()
155 end
Parker Schuh343481e2014-02-09 18:28:43 -0800156end