86 lines
2.0 KiB
Go
86 lines
2.0 KiB
Go
package memory
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"joylink.club/rtsssimulation/model"
|
||
"joylink.club/rtsssimulation/state"
|
||
)
|
||
|
||
// 仿真模型数据定义
|
||
type ModelData = model.IDeviceModel
|
||
|
||
// 仿真模型数据仓库
|
||
// 所有仿真实例共用
|
||
var storage *modelStorage = &modelStorage{idModelMap: make(map[string]ModelData, 2048), typeModelMap: make(map[state.DeviceType][]ModelData, 128)}
|
||
|
||
// 模型存储、管理仓库
|
||
type modelStorage struct {
|
||
//key-模型id,value-模型指针
|
||
idModelMap map[string]ModelData
|
||
//key-设备类型,value-对应设备类型的所有模型数据的指针列表
|
||
typeModelMap map[state.DeviceType][]ModelData
|
||
}
|
||
|
||
// 添加模型数据
|
||
// m 为具体模型数据的指针
|
||
func AddModel(m ModelData) error {
|
||
_, ok := storage.idModelMap[m.GetId()]
|
||
if ok {
|
||
return fmt.Errorf("模型[%s]已经存在", m.GetId())
|
||
} else {
|
||
storage.idModelMap[m.GetId()] = m
|
||
//
|
||
_, mdOk := storage.typeModelMap[m.GetType()]
|
||
if !mdOk {
|
||
storage.typeModelMap[m.GetType()] = make([]ModelData, 0, 512)
|
||
}
|
||
storage.typeModelMap[m.GetType()] = append(storage.typeModelMap[m.GetType()], m)
|
||
//
|
||
return nil
|
||
}
|
||
}
|
||
|
||
// 根据设备类型获取该类型的所有设备数据
|
||
func FindModelsByType(deviceType state.DeviceType) []ModelData {
|
||
models, ok := storage.typeModelMap[deviceType]
|
||
if ok {
|
||
return models
|
||
} else {
|
||
return []ModelData{}
|
||
}
|
||
}
|
||
|
||
// 根据设备id获取对应模型数据
|
||
// 如果不存在返回nil
|
||
func FindModelById(id string) ModelData {
|
||
md, ok := storage.idModelMap[id]
|
||
if ok {
|
||
return md
|
||
} else {
|
||
return nil
|
||
}
|
||
}
|
||
|
||
// 遍历某个类型的所有设备
|
||
func ForEachModelsByType(deviceType state.DeviceType, callback func(md ModelData)) {
|
||
mds := FindModelsByType(deviceType)
|
||
for _, modelData := range mds {
|
||
callback(modelData)
|
||
}
|
||
}
|
||
|
||
// 根据id检测设备模型数据是否存在
|
||
func HasModelById(id string) bool {
|
||
_, ok := storage.idModelMap[id]
|
||
return ok
|
||
}
|
||
|
||
// 获取当前模型数据总数量
|
||
func AmountOfModels() int {
|
||
return len(storage.idModelMap)
|
||
}
|
||
func AmountOfDeviceTypes() int {
|
||
return len(storage.typeModelMap)
|
||
}
|