diff options
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rwxr-xr-x | cpp/src/Slice/Parser.cpp | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp index 87ff6f21c9f..93cbb799fc6 100755 --- a/cpp/src/Slice/Parser.cpp +++ b/cpp/src/Slice/Parser.cpp @@ -42,8 +42,6 @@ enum { Supports, Mandatory, Required, Never }; } - - namespace Slice { @@ -427,6 +425,42 @@ Slice::Contained::addMetaData(const string& s) _metaData.push_back(s); } +FormatType +Slice::Contained::parseFormatMetaData(const list<string>& metaData) +{ + FormatType result = DefaultFormat; + + string tag; + string prefix = "format:"; + for(list<string>::const_iterator p = metaData.begin(); p != metaData.end(); ++p) + { + if(p->find(prefix) == 0) + { + tag = *p; + break; + } + } + + if(!tag.empty()) + { + tag = tag.substr(prefix.size()); + if(tag == "compact") + { + result = CompactFormat; + } + else if(tag == "sliced") + { + result = SlicedFormat; + } + else if(tag != "default") // TODO: Allow "default" to be specified as a format value? + { + // TODO: How to handle invalid format? + } + } + + return result; +} + bool Slice::Contained::operator<(const Contained& rhs) const { @@ -2658,7 +2692,7 @@ Slice::ClassDecl::usesClasses() const size_t Slice::ClassDecl::minWireSize() const { - return 4; // At least four bytes for an instance, if the instance is marshaled as an index. + return 1; // At least four bytes for an instance, if the instance is marshaled as an index. } bool @@ -4980,6 +5014,18 @@ Slice::Operation::attributes() const } } +FormatType +Slice::Operation::format() const +{ + FormatType format = parseFormatMetaData(getMetaData()); + if(format == DefaultFormat) + { + ContainedPtr cont = ContainedPtr::dynamicCast(container()); + assert(cont); + format = parseFormatMetaData(cont->getMetaData()); + } + return format; +} string Slice::Operation::kindOf() const |