blob: 14ba385cc853d724d2ce9c94337d1dea60cc7442 [file] [log] [blame]
Parker Schuh711db3e2014-02-12 09:47:34 -08001class Target::StructDec < Target::StructBase
Parker Schuh343481e2014-02-09 18:28:43 -08002 attr_accessor :name,:loc,:parent, :extern
3 def initialize(name)
4 @name = name
5 @members = []
6 end
Parker Schuh343481e2014-02-09 18:28:43 -08007 def add_member(member)
8 @members << member
9 end
Parker Schuh711db3e2014-02-12 09:47:34 -080010 def add_TypeRegister(o_type, member_func)
11 type = cpp_tree.get(self)
12 if(@loc == o_type.loc) #use relative name
13 tName = type.name
14 else #use full name
15 tName = @loc.to_cpp_id(type.name)
16 end
17 member_func.suite << "#{tName}::TypeGet()"
18 end
19 def create_GetType(type_class, cpp_tree)
20 member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
21 member_func.static = true
22 member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
23 member_func.suite << CPP::Return.new("*getter.Get()")
24 end
Parker Schuh343481e2014-02-09 18:28:43 -080025 def create(cpp_tree)
26 return self if(@extern)
27 orig_namespace = namespace = cpp_tree.get(@loc)
28 name = ""
29 if(namespace.class < Types::Type) #is nested
30 name = namespace.name + "_" + name
31 namespace = namespace.space
32 end
33 type_class = namespace.add_struct(name + @name)
34
35 @members.each do |elem|
36 type_class.add_member(elem.create_usage(cpp_tree))
37 end
Parker Schuh711db3e2014-02-12 09:47:34 -080038 create_DoGetType(type_class, cpp_tree)
39 create_GetType(type_class, cpp_tree)
Parker Schuh343481e2014-02-09 18:28:43 -080040 return type_class
41 end
Parker Schuh343481e2014-02-09 18:28:43 -080042 def getPrintFormat()
43 return "{" + @members.collect { |elem| elem.toPrintFormat() }.join(", ") + "}"
44 end
45 def fetchPrintArgs(args, parent = "")
46 @members.each do |elem|
47 elem.fetchPrintArgs(args, parent)
48 end
49 end
50 def toHost(offset, suite, parent)
51 @members.each do |elem|
52 elem.toHost(offset, suite, parent)
53 offset += elem.size()
54 end
55 end
56 def toNetwork(offset, suite, parent)
57 @members.each do |elem|
58 elem.toNetwork(offset, suite, parent)
59 offset += elem.size()
60 end
61 end
62 def zeroCall(suite, parent)
63 @members.each do |elem|
64 elem.zeroCall(suite, parent)
65 end
66 end
67end
68class Target::MessageStructElement < Target::Node
69 attr_accessor :name,:loc
70 def initialize(type,name)
71 @type, @name = type, name
72 end
73 def type()
74 return @type.get_name
75 end
76 def type_name(cpp_tree)
77 type = cpp_tree.get(@type)
78 if(@type.loc == @loc) #use relative name
79 return type.name
80 else #use full name
81 return @type.loc.to_cpp_id(type.name)
82 end
83 end
84 def size()
85 return @type.size()
86 end
87 def toPrintFormat()
88 @type.getPrintFormat()
89 end
90 def create_usage(cpp_tree)
91 return "#{type_name(cpp_tree)} #{@name}"
92 end
93 def fetchPrintArgs(args, parent = "")
94 @type.fetchPrintArgs(args, parent + "#{@name}.")
95 end
96 def toNetwork(offset,suite, parent = "")
97 @type.toNetwork(offset, suite, parent + "#{@name}.")
98 end
99 def toHost(offset,suite, parent = "")
100 @type.toHost(offset, suite, parent + "#{@name}.")
101 end
102 def set_message_builder(suite)
103 suite << "msg_ptr_->#{@name} = #{@name}"
104 end
105
106 def zeroCall(suite, parent = "")
107 @type.zeroCall(suite, parent + "#{@name}.")
108 end
Parker Schuh711db3e2014-02-12 09:47:34 -0800109 def simpleStr()
110 "#{@type.simpleStr()} #{@name}"
111 end
112 def getTypeID()
113 return @type.getTypeID()
114 end
Parker Schuh343481e2014-02-09 18:28:43 -0800115end