iw6-mod/deps/protobuf/js/experimental/runtime/kernel/message_set.js
2024-02-27 01:34:37 -05:00

286 lines
6.5 KiB
JavaScript

/*
##########################################################
# #
# __ __ _____ _ _ _____ _ _ _____ #
# \ \ / /\ | __ \| \ | |_ _| \ | |/ ____| #
# \ \ /\ / / \ | |__) | \| | | | | \| | | __ #
# \ \/ \/ / /\ \ | _ /| . ` | | | | . ` | | |_ | #
# \ /\ / ____ \| | \ \| |\ |_| |_| |\ | |__| | #
# \/ \/_/ \_\_| \_\_| \_|_____|_| \_|\_____| #
# #
# #
##########################################################
# Do not use this class in your code. This class purely #
# exists to make proto code generation easier. #
##########################################################
*/
goog.module('protobuf.runtime.MessageSet');
const InternalMessage = goog.require('protobuf.binary.InternalMessage');
const Kernel = goog.require('protobuf.runtime.Kernel');
// These are the tags for the old MessageSet format, which was defined as:
// message MessageSet {
// repeated group Item = 1 {
// required uint32 type_id = 2;
// optional bytes message = 3;
// }
// }
/** @const {number} */
const MSET_GROUP_FIELD_NUMBER = 1;
/** @const {number} */
const MSET_TYPE_ID_FIELD_NUMBER = 2;
/** @const {number} */
const MSET_MESSAGE_FIELD_NUMBER = 3;
/**
* @param {!Kernel} kernel
* @return {!Map<number, !Item>}
*/
function createItemMap(kernel) {
const itemMap = new Map();
let totalCount = 0;
for (const item of kernel.getRepeatedGroupIterable(
MSET_GROUP_FIELD_NUMBER, Item.fromKernel)) {
itemMap.set(item.getTypeId(), item);
totalCount++;
}
// Normalize the entries.
if (totalCount > itemMap.size) {
writeItemMap(kernel, itemMap);
}
return itemMap;
}
/**
* @param {!Kernel} kernel
* @param {!Map<number, !Item>} itemMap
*/
function writeItemMap(kernel, itemMap) {
kernel.setRepeatedGroupIterable(MSET_GROUP_FIELD_NUMBER, itemMap.values());
}
/**
* @implements {InternalMessage}
* @final
*/
class MessageSet {
/**
* @param {!Kernel} kernel
* @return {!MessageSet}
*/
static fromKernel(kernel) {
const itemMap = createItemMap(kernel);
return new MessageSet(kernel, itemMap);
}
/**
* @return {!MessageSet}
*/
static createEmpty() {
return MessageSet.fromKernel(Kernel.createEmpty());
}
/**
* @param {!Kernel} kernel
* @param {!Map<number, !Item>} itemMap
* @private
*/
constructor(kernel, itemMap) {
/** @const {!Kernel} @private */
this.kernel_ = kernel;
/** @const {!Map<number, !Item>} @private */
this.itemMap_ = itemMap;
}
// code helpers for code gen
/**
* @param {number} typeId
* @param {function(!Kernel):T} instanceCreator
* @param {number=} pivot
* @return {?T}
* @template T
*/
getMessageOrNull(typeId, instanceCreator, pivot) {
const item = this.itemMap_.get(typeId);
return item ? item.getMessageOrNull(instanceCreator, pivot) : null;
}
/**
* @param {number} typeId
* @param {function(!Kernel):T} instanceCreator
* @param {number=} pivot
* @return {T}
* @template T
*/
getMessageAttach(typeId, instanceCreator, pivot) {
let item = this.itemMap_.get(typeId);
if (item) {
return item.getMessageAttach(instanceCreator, pivot);
}
const message = instanceCreator(Kernel.createEmpty());
this.setMessage(typeId, message);
return message;
}
/**
* @param {number} typeId
* @param {number=} pivot
* @return {?Kernel}
*/
getMessageAccessorOrNull(typeId, pivot) {
const item = this.itemMap_.get(typeId);
return item ? item.getMessageAccessorOrNull(pivot) : null;
}
/**
* @param {number} typeId
*/
clearMessage(typeId) {
if (this.itemMap_.delete(typeId)) {
writeItemMap(this.kernel_, this.itemMap_);
}
}
/**
* @param {number} typeId
* @return {boolean}
*/
hasMessage(typeId) {
return this.itemMap_.has(typeId);
}
/**
* @param {number} typeId
* @param {!InternalMessage} value
*/
setMessage(typeId, value) {
const item = this.itemMap_.get(typeId);
if (item) {
item.setMessage(value);
} else {
this.itemMap_.set(typeId, Item.create(typeId, value));
writeItemMap(this.kernel_, this.itemMap_);
}
}
/**
* @return {!Kernel}
* @override
*/
internalGetKernel() {
return this.kernel_;
}
}
/**
* @implements {InternalMessage}
* @final
*/
class Item {
/**
* @param {number} typeId
* @param {!InternalMessage} message
* @return {!Item}
*/
static create(typeId, message) {
const messageSet = Item.fromKernel(Kernel.createEmpty());
messageSet.setTypeId_(typeId);
messageSet.setMessage(message);
return messageSet;
}
/**
* @param {!Kernel} kernel
* @return {!Item}
*/
static fromKernel(kernel) {
return new Item(kernel);
}
/**
* @param {!Kernel} kernel
* @private
*/
constructor(kernel) {
/** @const {!Kernel} @private */
this.kernel_ = kernel;
}
/**
* @param {function(!Kernel):T} instanceCreator
* @param {number=} pivot
* @return {T}
* @template T
*/
getMessage(instanceCreator, pivot) {
return this.kernel_.getMessage(
MSET_MESSAGE_FIELD_NUMBER, instanceCreator, pivot);
}
/**
* @param {function(!Kernel):T} instanceCreator
* @param {number=} pivot
* @return {?T}
* @template T
*/
getMessageOrNull(instanceCreator, pivot) {
return this.kernel_.getMessageOrNull(
MSET_MESSAGE_FIELD_NUMBER, instanceCreator, pivot);
}
/**
* @param {function(!Kernel):T} instanceCreator
* @param {number=} pivot
* @return {T}
* @template T
*/
getMessageAttach(instanceCreator, pivot) {
return this.kernel_.getMessageAttach(
MSET_MESSAGE_FIELD_NUMBER, instanceCreator, pivot);
}
/**
* @param {number=} pivot
* @return {?Kernel}
*/
getMessageAccessorOrNull(pivot) {
return this.kernel_.getMessageAccessorOrNull(
MSET_MESSAGE_FIELD_NUMBER, pivot);
}
/** @param {!InternalMessage} value */
setMessage(value) {
this.kernel_.setMessage(MSET_MESSAGE_FIELD_NUMBER, value);
}
/** @return {number} */
getTypeId() {
return this.kernel_.getUint32WithDefault(MSET_TYPE_ID_FIELD_NUMBER);
}
/**
* @param {number} value
* @private
*/
setTypeId_(value) {
this.kernel_.setUint32(MSET_TYPE_ID_FIELD_NUMBER, value);
}
/**
* @return {!Kernel}
* @override
*/
internalGetKernel() {
return this.kernel_;
}
}
exports = MessageSet;