blob: 7211ff09f7eaa6ee14906a920fc0a25abccf6159 [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
Austin Schuh7e958392014-10-21 22:16:23 -070088 def create_usage(cpp_tree, this_name=nil)
89 if (this_name == nil)
90 this_name = @name
91 end
92 return "#{type_name(cpp_tree)} #{this_name}"
Parker Schuh343481e2014-02-09 18:28:43 -080093 end
Brian Silverman665e60c2014-02-12 13:57:10 -080094 def add_TypeRegister(cpp_tree, o_type, member_func)
95 type = cpp_tree.get(@type)
96 tName = @type.loc.to_cpp_id(type.name)
97 member_func.suite << "#{tName}::GetType()"
98 end
Austin Schuh7e958392014-10-21 22:16:23 -070099 def fetchPrintArgs(args, parent = "", this_name=nil)
100 if (this_name == nil)
101 this_name = @name
102 end
103 @type.fetchPrintArgs(args, parent + "#{this_name}.")
Parker Schuh343481e2014-02-09 18:28:43 -0800104 end
Austin Schuh7e958392014-10-21 22:16:23 -0700105 def toNetwork(offset,suite, parent = "", this_name=nil)
106 if (this_name == nil)
107 this_name = @name
108 end
109 @type.toNetwork(offset, suite, parent + "#{this_name}.")
Parker Schuh343481e2014-02-09 18:28:43 -0800110 end
Austin Schuh7e958392014-10-21 22:16:23 -0700111 def toHost(offset,suite, parent = "", this_name=nil)
112 if (this_name == nil)
113 this_name = @name
114 end
115 @type.toHost(offset, suite, parent + "#{this_name}.")
Parker Schuh343481e2014-02-09 18:28:43 -0800116 end
Austin Schuh7e958392014-10-21 22:16:23 -0700117 def set_message_builder(suite, this_name=nil)
118 if (this_name == nil)
119 this_name = @name
120 end
121 suite << "msg_ptr_->#{this_name} = #{this_name}"
Parker Schuh343481e2014-02-09 18:28:43 -0800122 end
123
Austin Schuh7e958392014-10-21 22:16:23 -0700124 def zeroCall(suite, parent = "", this_name=nil)
125 if (this_name == nil)
126 this_name = @name
127 end
128 @type.zeroCall(suite, parent + "#{this_name}.")
Parker Schuh343481e2014-02-09 18:28:43 -0800129 end
Parker Schuh711db3e2014-02-12 09:47:34 -0800130 def simpleStr()
131 "#{@type.simpleStr()} #{@name}"
132 end
133 def getTypeID()
134 return @type.getTypeID()
135 end
Parker Schuh343481e2014-02-09 18:28:43 -0800136end