Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
6.5 KiB
285 lines
6.5 KiB
/* |
|
########################################################## |
|
# # |
|
# __ __ _____ _ _ _____ _ _ _____ # |
|
# \ \ / /\ | __ \| \ | |_ _| \ | |/ ____| # |
|
# \ \ /\ / / \ | |__) | \| | | | | \| | | __ # |
|
# \ \/ \/ / /\ \ | _ /| . ` | | | | . ` | | |_ | # |
|
# \ /\ / ____ \| | \ \| |\ |_| |_| |\ | |__| | # |
|
# \/ \/_/ \_\_| \_\_| \_|_____|_| \_|\_____| # |
|
# # |
|
# # |
|
########################################################## |
|
# 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;
|
|
|