summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2012-05-08 18:14:39 -0700
committerMark Spruiell <mes@zeroc.com>2012-05-08 18:14:39 -0700
commit7774bb92669779fd165a0510a360fdaecd69f0c3 (patch)
tree8ea8bba6cac4128cd3e511ff21534db130ff8e49 /cpp/src/Slice/Parser.cpp
parentFixed ICE-4709, batch requests and UnmarshalOutOfBoundsException (diff)
downloadice-7774bb92669779fd165a0510a360fdaecd69f0c3.tar.bz2
ice-7774bb92669779fd165a0510a360fdaecd69f0c3.tar.xz
ice-7774bb92669779fd165a0510a360fdaecd69f0c3.zip
* C++ implementation for compact/sliced formats
* C++ implementation for "preserve-slice" metadata * C++ tests for compact/sliced/preserved types * Updated stream API * Python changes for stream API * Python tests for compact/sliced formats * Added Ice.Default.SlicedFormat property
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rwxr-xr-xcpp/src/Slice/Parser.cpp52
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