blob: 05c2932028fb923f7dfbd33fb780079fbe35616a [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)
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)
Parker Schuh343481e2014-02-09 18:28:43 -080038 return type_class
39 end
Parker Schuh343481e2014-02-09 18:28:43 -080040 def getPrintFormat()
41 return "{" + @members.collect { |elem| elem.toPrintFormat() }.join(", ") + "}"
42 end
43 def fetchPrintArgs(args, parent = "")
44 @members.each do |elem|
45 elem.fetchPrintArgs(args, parent)
46 end
47 end
48 def toHost(offset, suite, parent)
49 @members.each do |elem|
50 elem.toHost(offset, suite, parent)
Brian Silverman16c82972014-02-13 15:36:40 -080051 offset += " + #{elem.size()}"
Parker Schuh343481e2014-02-09 18:28:43 -080052 end
53 end
54 def toNetwork(offset, suite, parent)
55 @members.each do |elem|
56 elem.toNetwork(offset, suite, parent)
Brian Silverman16c82972014-02-13 15:36:40 -080057 offset += " + #{elem.size()}"
Parker Schuh343481e2014-02-09 18:28:43 -080058 end
59 end
60 def zeroCall(suite, parent)
61 @members.each do |elem|
62 elem.zeroCall(suite, parent)
63 end
64 end
65end
66class Target::MessageStructElement < Target::Node
67 attr_accessor :name,:loc
68 def initialize(type,name)
69 @type, @name = type, name
70 end
71 def type()
72 return @type.get_name
73 end
74 def type_name(cpp_tree)
75 type = cpp_tree.get(@type)
76 if(@type.loc == @loc) #use relative name
77 return type.name
78 else #use full name
79 return @type.loc.to_cpp_id(type.name)
80 end
81 end
82 def size()
83 return @type.size()
84 end
85 def toPrintFormat()
86 @type.getPrintFormat()
87 end
88 def create_usage(cpp_tree)
89 return "#{type_name(cpp_tree)} #{@name}"
90 end
Brian Silverman665e60c2014-02-12 13:57:10 -080091 def add_TypeRegister(cpp_tree, o_type, member_func)
92 type = cpp_tree.get(@type)
93 tName = @type.loc.to_cpp_id(type.name)
94 member_func.suite << "#{tName}::GetType()"
95 end
Parker Schuh343481e2014-02-09 18:28:43 -080096 def fetchPrintArgs(args, parent = "")
97 @type.fetchPrintArgs(args, parent + "#{@name}.")
98 end
99 def toNetwork(offset,suite, parent = "")
100 @type.toNetwork(offset, suite, parent + "#{@name}.")
101 end
102 def toHost(offset,suite, parent = "")
103 @type.toHost(offset, suite, parent + "#{@name}.")
104 end
105 def set_message_builder(suite)
106 suite << "msg_ptr_->#{@name} = #{@name}"
107 end
108
109 def zeroCall(suite, parent = "")
110 @type.zeroCall(suite, parent + "#{@name}.")
111 end
Parker Schuh711db3e2014-02-12 09:47:34 -0800112 def simpleStr()
113 "#{@type.simpleStr()} #{@name}"
114 end
115 def getTypeID()
116 return @type.getTypeID()
117 end
Parker Schuh343481e2014-02-09 18:28:43 -0800118end