@@ -178,6 +178,14 @@ function getPackageNameByType(type) {
178178 return type.pkgName;
179179 }
180180}
181+
182+ function extractMemberNames(fields) {
183+ let memberNames = [];
184+ fields.forEach(field => {
185+ memberNames.push(field.name);
186+ });
187+ return JSON.stringify(memberNames);
188+ }
181189}}
182190
183191{{? usePlainTypedArray}}
@@ -231,9 +239,13 @@ class {{=objectWrapper}} {
231239 this._{{=field.name}}Array = [];
232240 {{?}}
233241 {{~}}
242+
234243 if (typeof other === 'object' && other._refObject) {
235244 this._refObject = new {{=refObjectType}}(other._refObject.toObject());
236245 {{~ it.spec.fields :field}}
246+ {{? field.type.isPrimitiveType && !field.type.isArray}}
247+ this._{{=field.name}}Intialized = true;
248+ {{?}}
237249 {{? field.type.isArray}}
238250 this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
239251 this._wrapperFields.{{=field.name}}.copy(other._wrapperFields.{{=field.name}});
@@ -247,6 +259,9 @@ class {{=objectWrapper}} {
247259 } else {
248260 this._refObject = new {{=refObjectType}}();
249261 {{~ it.spec.fields :field}}
262+ {{? field.type.isPrimitiveType && !field.type.isArray}}
263+ this._{{=field.name}}Intialized = false;
264+ {{?}}
250265 {{? field.type.isArray}}
251266 this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
252267 {{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
@@ -287,14 +302,23 @@ class {{=objectWrapper}} {
287302 return this._refObject.ref();
288303 }
289304
290- freeze(own = false) {
305+ freeze(own = false, checkConsistency = false) {
306+ if (checkConsistency) {
307+ {{~ it.spec.fields :field}}
308+ {{? field.type.isPrimitiveType && !field.type.isArray}}
309+ if (!this._{{=field.name}}Intialized) {
310+ throw new TypeError('Invalid argument: {{=field.name}} in {{=it.spec.msgName}}');
311+ }
312+ {{?}}
313+ {{~}}
314+ }
291315 {{~ it.spec.fields :field}}
292316 {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
293317 this._wrapperFields.{{=field.name}}.fill(this._{{=field.name}}Array);
294- this._wrapperFields.{{=field.name}}.freeze(own);
318+ this._wrapperFields.{{=field.name}}.freeze(own, checkConsistency );
295319 this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
296320 {{?? !field.type.isPrimitiveType || field.type.isArray}}
297- this._wrapperFields.{{=field.name}}.freeze(own);
321+ this._wrapperFields.{{=field.name}}.freeze(own, checkConsistency );
298322 this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
299323 {{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
300324 if (own) {
@@ -310,12 +334,15 @@ class {{=objectWrapper}} {
310334 }
311335
312336 serialize() {
313- this.freeze();
337+ this.freeze(false, true );
314338 return this._refObject.ref();
315339 }
316340
317341 deserialize(refObject) {
318342 {{~ it.spec.fields :field}}
343+ {{? field.type.isPrimitiveType && !field.type.isArray}}
344+ this._{{=field.name}}Intialized = true;
345+ {{?}}
319346 {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
320347 refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size ;
321348 for (let index = 0; index < refObject.{{=field.name}}.size ; index++) {
@@ -381,13 +408,23 @@ class {{=objectWrapper}} {
381408 {{?? !field.type.isPrimitiveType && !field.type.isArray}}
382409 return this._wrapperFields.{{=field.name}};
383410 {{?? !field.type.isArray && field.type.type === 'string' && it.spec.msgName !== 'String'}}
411+ if (!this._{{=field.name}}Intialized) {
412+ return undefined;
413+ }
384414 return this._wrapperFields.{{=field.name}}.data;
385415 {{?? true}}
416+ if (!this._{{=field.name}}Intialized) {
417+ return undefined;
418+ }
386419 return this._refObject.{{=field.name}};
387420 {{?}}
388421 }
389422
390423 set {{=field.name}}(value) {
424+ {{? field.type.isPrimitiveType && !field.type.isArray}}
425+ this._{{=field.name}}Intialized = true;
426+ {{?}}
427+
391428 {{? field.type.isArray && isTypedArrayType(field.type)}}
392429 this._wrapperFields['{{=field.name}}'].fill(value);
393430 {{?? field.type.isArray && field.type.isPrimitiveType}}
@@ -412,6 +449,9 @@ class {{=objectWrapper}} {
412449 this._refObject = new {{=refObjectType}}(refObject.toObject());
413450
414451 {{~ it.spec.fields :field}}
452+ {{? field.type.isPrimitiveType && !field.type.isArray}}
453+ this._{{=field.name}}Intialized = true;
454+ {{?}}
415455 {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
416456 refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size ;
417457 for (let index = 0; index < refObject.{{=field.name}}.size ; index++) {
@@ -427,6 +467,9 @@ class {{=objectWrapper}} {
427467 this._refObject = new {{=refObjectType}}(other._refObject.toObject());
428468
429469 {{~ it.spec.fields :field}}
470+ {{? field.type.isPrimitiveType && !field.type.isArray}}
471+ this._{{=field.name}}Intialized = true;
472+ {{?}}
430473 {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
431474 this._{{=field.name}}Array = other._{{=field.name}}Array.slice();
432475 {{?? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
@@ -442,6 +485,11 @@ class {{=objectWrapper}} {
442485 static get ROSMessageDef() {
443486 return {{=compactMsgDefJSON}};
444487 }
488+
489+ hasMember(name) {
490+ let memberNames = {{=extractMemberNames(it.spec.fields)}};
491+ return memberNames.indexOf(name) !== -1;
492+ }
445493}
446494
447495// Define the wrapper of array class.
0 commit comments