From 27b1f7cc1b061fbf3a1582963d0af08d5839d480 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Mon, 11 Jun 2012 18:53:17 +0200 Subject: Support for optionals --- cpp/src/Slice/Parser.cpp | 92 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 16 deletions(-) (limited to 'cpp/src/Slice/Parser.cpp') diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp index 50b1e68101d..e7ecd451617 100755 --- a/cpp/src/Slice/Parser.cpp +++ b/cpp/src/Slice/Parser.cpp @@ -40,6 +40,30 @@ string readWriteAttribute[] = { "read", "write" }; string txAttribute[] = { "supports", "mandatory", "required", "never" }; enum { Supports, Mandatory, Required, Never }; +DataMemberList +filterOrderedOptionalDataMembers(const DataMemberList& members) +{ + class SortFn + { + public: + static bool compare(const DataMemberPtr& lhs, const DataMemberPtr& rhs) + { + return lhs->tag() < rhs->tag(); + } + }; + + DataMemberList result; + for(DataMemberList::const_iterator p = members.begin(); p != members.end(); ++p) + { + if((*p)->optional()) + { + result.push_back(*p); + } + } + result.sort(SortFn::compare); + return result; +} + } namespace Slice @@ -2939,6 +2963,8 @@ Slice::ClassDef::destroy() OperationPtr Slice::ClassDef::createOperation(const string& name, const TypePtr& returnType, + bool optional, + int tag, Operation::Mode mode) { checkIdentifier(name); @@ -3037,7 +3063,7 @@ Slice::ClassDef::createOperation(const string& name, } _hasOperations = true; - OperationPtr op = new Operation(this, name, returnType, mode); + OperationPtr op = new Operation(this, name, returnType, optional, tag, mode); _contents.push_back(op); return op; } @@ -3282,6 +3308,12 @@ Slice::ClassDef::dataMembers() const return result; } +DataMemberList +Slice::ClassDef::orderedOptionalDataMembers() const +{ + return filterOrderedOptionalDataMembers(dataMembers()); +} + // // Return the data members of this class and its parent classes, in base-to-derived order. // @@ -3753,6 +3785,12 @@ Slice::Exception::dataMembers() const return result; } +DataMemberList +Slice::Exception::orderedOptionalDataMembers() const +{ + return filterOrderedOptionalDataMembers(dataMembers()); +} + // // Return the data members of this exception and its parent exceptions, in base-to-derived order. // @@ -4556,22 +4594,13 @@ Slice::Enum::usesClasses() const size_t Slice::Enum::minWireSize() const { - size_t sz = _enumerators.size(); - if(sz <= 0x7f) - { - return 1; - } - if(sz <= 0x7fff) - { - return 2; - } - return 4; + return 1; } bool Slice::Enum::isVariableLength() const { - return false; + return true; } string @@ -4716,6 +4745,18 @@ Slice::Operation::returnType() const return _returnType; } +bool +Slice::Operation::returnIsOptional() const +{ + return _returnIsOptional; +} + +int +Slice::Operation::returnTag() const +{ + return _returnTag; +} + Operation::Mode Slice::Operation::mode() const { @@ -4736,7 +4777,7 @@ Slice::Operation::sendMode() const } ParamDeclPtr -Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool isOutParam) +Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool isOutParam, bool optional, int tag) { checkIdentifier(name); @@ -4835,7 +4876,7 @@ Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool _unit->error(msg); } - ParamDeclPtr p = new ParamDecl(this, name, type, isOutParam); + ParamDeclPtr p = new ParamDecl(this, name, type, isOutParam, optional, tag); _contents.push_back(p); return p; } @@ -5121,11 +5162,15 @@ Slice::Operation::visit(ParserVisitor* visitor, bool) Slice::Operation::Operation(const ContainerPtr& container, const string& name, const TypePtr& returnType, + bool returnIsOptional, + int returnTag, Mode mode) : SyntaxTreeBase(container->unit()), Contained(container, name), Container(container->unit()), _returnType(returnType), + _returnIsOptional(returnIsOptional), + _returnTag(returnTag), _mode(mode) { if(_unit->profile() == IceE) @@ -5166,6 +5211,18 @@ Slice::ParamDecl::isOutParam() const return _isOutParam; } +bool +Slice::ParamDecl::optional() const +{ + return _optional; +} + +int +Slice::ParamDecl::tag() const +{ + return _tag; +} + Contained::ContainedType Slice::ParamDecl::containedType() const { @@ -5196,11 +5253,14 @@ Slice::ParamDecl::visit(ParserVisitor* visitor, bool) visitor->visitParamDecl(this); } -Slice::ParamDecl::ParamDecl(const ContainerPtr& container, const string& name, const TypePtr& type, bool isOutParam) : +Slice::ParamDecl::ParamDecl(const ContainerPtr& container, const string& name, const TypePtr& type, bool isOutParam, + bool optional, int tag) : SyntaxTreeBase(container->unit()), Contained(container, name), _type(type), - _isOutParam(isOutParam) + _isOutParam(isOutParam), + _optional(optional), + _tag(tag) { } -- cgit v1.2.3