in src/cas/internal_casserializer.cpp [112:240]
void CASSerializer::serializeTypeSystem(uima::internal::CASDefinition const & casDef, uima::internal::SerializedCAS & rSerializedCAS) {
uima::lowlevel::TypeSystem const & crTypeSystem = casDef.getTypeSystem();
UnicodeStringRef invalidUSP(rSerializedCAS.iv_emptyString.getBuffer(), rSerializedCAS.iv_emptyString.length());
assert( invalidUSP.getBuffer() != NULL );
assert( invalidUSP.length() == 0);
// 1. inheritance vector
rSerializedCAS.iv_vecTypeInheritanceTable.clear();
size_t uiTypeNum = crTypeSystem.getNumberOfTypes() + 1;
rSerializedCAS.iv_vecTypeInheritanceTable.resize(uiTypeNum, 0);
#ifndef NDEBUG
vector<uima::lowlevel::TyFSType> vecTypes;
crTypeSystem.getAllTypes(vecTypes);
assert( isInterval(1, uiTypeNum, vecTypes) );
assert( uiTypeNum == vecTypes.size() + 1);
#endif
size_t i;
assert( 0 == uima::lowlevel::TypeSystem::INVALID_TYPE );
assert( 1 == crTypeSystem.getTopType() );
for (i=2; i<uiTypeNum; ++i) {
uima::lowlevel::TyFSType tyChild = (uima::lowlevel::TyFSType) i;
uima::lowlevel::TyFSType tyParent = crTypeSystem.getParentType( tyChild );
assert( tyParent <rSerializedCAS.iv_vecTypeInheritanceTable.size() );
rSerializedCAS.iv_vecTypeInheritanceTable[tyChild] = tyParent;
}
// 2. feature intro vector
rSerializedCAS.iv_vecFeatureDefinitionTable.clear();
size_t uiFeatureNum = crTypeSystem.getNumberOfFeatures() + 1;
// leave the first three cells empty
rSerializedCAS.iv_vecFeatureDefinitionTable.resize(3,0);
#ifndef NDEBUG
vector<uima::lowlevel::TyFSFeature> vecFeatures;
crTypeSystem.getAllFeatures(vecFeatures);
assert( isInterval(1, uiFeatureNum, vecFeatures) );
assert( uiFeatureNum == vecFeatures.size() + 1);
#endif
assert( 0 == uima::lowlevel::TypeSystem::INVALID_FEATURE );
for (i=1; i<uiFeatureNum; ++i) {
uima::lowlevel::TyFSFeature tyFeat = (uima::lowlevel::TyFSFeature) i;
UIMA_TPRINT("Adding feature with ID: " << tyFeat );
UIMA_TPRINT("Adding feature: " << crTypeSystem.getFeatureName(tyFeat) );
uima::lowlevel::TyFSType tyIntroType = crTypeSystem.getIntroType(tyFeat);
uima::lowlevel::TyFSType tyRangeType = crTypeSystem.getRangeType(tyFeat);
int tyMultiRefs = crTypeSystem.isMultipleReferencesAllowed(tyFeat) ? 1 : 0;
rSerializedCAS.iv_vecFeatureDefinitionTable.push_back( tyIntroType );
rSerializedCAS.iv_vecFeatureDefinitionTable.push_back( tyRangeType );
rSerializedCAS.iv_vecFeatureDefinitionTable.push_back( tyMultiRefs );
}
#ifndef NDEBUG
for (i=1; i<vecFeatures.size(); ++i) {
uima::lowlevel::TyFSFeature tyFeat = vecFeatures[i];
uima::lowlevel::TyFSType tyIntroType = crTypeSystem.getIntroType(tyFeat);
uima::lowlevel::TyFSType tyRangeType = crTypeSystem.getRangeType(tyFeat);
int tyMultiRefs = crTypeSystem.isMultipleReferencesAllowed(tyFeat) ? 1 : 0;
assert( (tyFeat*2) <rSerializedCAS.iv_vecFeatureDefinitionTable.size() );
assert( (tyFeat*2+1) <rSerializedCAS.iv_vecFeatureDefinitionTable.size() );
assert( rSerializedCAS.iv_vecFeatureDefinitionTable[tyFeat*3] == tyIntroType );
assert( rSerializedCAS.iv_vecFeatureDefinitionTable[tyFeat*3+1] == tyRangeType );
assert( rSerializedCAS.iv_vecFeatureDefinitionTable[tyFeat*3+2] == tyMultiRefs );
}
#endif
// 3. type string table
rSerializedCAS.iv_vecTypeSymbolTable.resize(uiTypeNum);
assert( rSerializedCAS.iv_vecTypeSymbolTable.size() == uiTypeNum );
rSerializedCAS.iv_vecTypeSymbolTable[0] = invalidUSP;
for (i=1; i<uiTypeNum; ++i) {
icu::UnicodeString const & crTypeName = crTypeSystem.getTypeName(i);
UnicodeStringRef pus = createString( crTypeName.getBuffer(), crTypeName.length(), rSerializedCAS);
rSerializedCAS.iv_vecTypeSymbolTable[i] = pus;
}
// 4. feature string and feature offset table
rSerializedCAS.iv_vecFeatureSymbolTable.resize(uiFeatureNum);
assert( rSerializedCAS.iv_vecFeatureSymbolTable.size() == uiFeatureNum );
rSerializedCAS.iv_vecFeatureOffsetTable.resize(uiFeatureNum);
assert( rSerializedCAS.iv_vecFeatureOffsetTable.size() == uiFeatureNum );
rSerializedCAS.iv_vecFeatureSymbolTable[0] = invalidUSP;
rSerializedCAS.iv_vecFeatureOffsetTable[0] = 0;
for (i=1; i<uiFeatureNum; ++i) {
uima::lowlevel::TyFSFeature tyFeat = i;
// string
icu::UnicodeString const & crFeatureName = crTypeSystem.getFeatureBaseName(tyFeat);
UnicodeStringRef pus = createString( crFeatureName.getBuffer(), crFeatureName.length(), rSerializedCAS);
rSerializedCAS.iv_vecFeatureSymbolTable[i] = pus;
// offset
rSerializedCAS.iv_vecFeatureOffsetTable[i] = crTypeSystem.getFeatureOffset(tyFeat);
}
// 5. type priorities
rSerializedCAS.iv_vecTypePriorityTable.resize(uiTypeNum-1);
for (i=1; i<uiTypeNum; ++i) {
size_t num = crTypeSystem.getTypePriorityNumber((uima::lowlevel::TyFSType) i);
rSerializedCAS.iv_vecTypePriorityTable[num] = i;
}
// 6. string sub types
vector<uima::lowlevel::TyFSType> stringSubTypes;
crTypeSystem.getDirectSubTypes( uima::internal::gs_tyStringType,
stringSubTypes );
rSerializedCAS.iv_stringSubTypes.clear();
for (i=0; i<stringSubTypes.size(); ++i) {
rSerializedCAS.iv_stringSubTypes.push_back(stringSubTypes[i]);
}
rSerializedCAS.iv_stringSubTypeValues.clear();
rSerializedCAS.iv_stringSubTypeValuePos.clear();
for (i=0; i<rSerializedCAS.iv_stringSubTypes.size(); ++i) {
size_t n = rSerializedCAS.iv_stringSubTypeValues.size();
rSerializedCAS.iv_stringSubTypeValuePos.push_back(n);
vector<icu::UnicodeString> const & stringValues = crTypeSystem.getStringsForStringSubtype(rSerializedCAS.iv_stringSubTypes[i]);
size_t j;
for (j=0; j<stringValues.size(); ++j) {
UnicodeStringRef ref(stringValues[j]);
rSerializedCAS.iv_stringSubTypeValues.push_back( ref );
}
}
assert( rSerializedCAS.iv_stringSubTypes.size() == rSerializedCAS.iv_stringSubTypeValuePos.size() );
}