blob: 868f1f27aa94341c07b59377ee584cec1b60c0f6 [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 create_GetType(type_class, cpp_tree)
Brian Silverman665e60c2014-02-12 13:57:10 -080011 member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","GetType")
12 type_class.add_member(member_func)
Parker Schuh711db3e2014-02-12 09:47:34 -080013 member_func.static = true
14 member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
Brian Silverman665e60c2014-02-12 13:57:10 -080015 member_func.suite << CPP::Return.new("getter.Get()")
Parker Schuh711db3e2014-02-12 09:47:34 -080016 end
Parker Schuh343481e2014-02-09 18:28:43 -080017 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)
26
27 @members.each do |elem|
28 type_class.add_member(elem.create_usage(cpp_tree))
29 end
Parker Schuh711db3e2014-02-12 09:47:34 -080030 create_DoGetType(type_class, cpp_tree)
31 create_GetType(type_class, cpp_tree)
Parker Schuh343481e2014-02-09 18:28:43 -080032 return type_class
33 end
Parker Schuh343481e2014-02-09 18:28:43 -080034 def getPrintFormat()
35 return "{" + @members.collect { |elem| elem.toPrintFormat() }.join(", ") + "}"
36 end
37 def fetchPrintArgs(args, parent = "")
38 @members.each do |elem|
39 elem.fetchPrintArgs(args, parent)
40 end
41 end
42 def toHost(offset, suite, parent)
43 @members.each do |elem|
44 elem.toHost(offset, suite, parent)
45 offset += elem.size()
46 end
47 end
48 def toNetwork(offset, suite, parent)
49 @members.each do |elem|
50 elem.toNetwork(offset, suite, parent)
51 offset += elem.size()
52 end
53 end
54 def zeroCall(suite, parent)
55 @members.each do |elem|
56 elem.zeroCall(suite, parent)
57 end
58 end
59end
60class Target::MessageStructElement < Target::Node
61 attr_accessor :name,:loc
62 def initialize(type,name)
63 @type, @name = type, name
64 end
65 def type()
66 return @type.get_name
67 end
68 def type_name(cpp_tree)
69 type = cpp_tree.get(@type)
70 if(@type.loc == @loc) #use relative name
71 return type.name
72 else #use full name
73 return @type.loc.to_cpp_id(type.name)
74 end
75 end
76 def size()
77 return @type.size()
78 end
79 def toPrintFormat()
80 @type.getPrintFormat()
81 end
82 def create_usage(cpp_tree)
83 return "#{type_name(cpp_tree)} #{@name}"
84 end
Brian Silverman665e60c2014-02-12 13:57:10 -080085 def add_TypeRegister(cpp_tree, o_type, member_func)
86 type = cpp_tree.get(@type)
87 tName = @type.loc.to_cpp_id(type.name)
88 member_func.suite << "#{tName}::GetType()"
89 end
Parker Schuh343481e2014-02-09 18:28:43 -080090 def fetchPrintArgs(args, parent = "")
91 @type.fetchPrintArgs(args, parent + "#{@name}.")
92 end
93 def toNetwork(offset,suite, parent = "")
94 @type.toNetwork(offset, suite, parent + "#{@name}.")
95 end
96 def toHost(offset,suite, parent = "")
97 @type.toHost(offset, suite, parent + "#{@name}.")
98 end
99 def set_message_builder(suite)
100 suite << "msg_ptr_->#{@name} = #{@name}"
101 end
102
103 def zeroCall(suite, parent = "")
104 @type.zeroCall(suite, parent + "#{@name}.")
105 end
Parker Schuh711db3e2014-02-12 09:47:34 -0800106 def simpleStr()
107 "#{@type.simpleStr()} #{@name}"
108 end
109 def getTypeID()
110 return @type.getTypeID()
111 end
Parker Schuh343481e2014-02-09 18:28:43 -0800112end