added NotNull pointer to to pointer extensions

This commit is contained in:
fraillt
2017-10-30 08:55:27 +02:00
parent 5b1dc3bcfa
commit be9ccf08d9
4 changed files with 53 additions and 9 deletions

View File

@@ -99,7 +99,8 @@ namespace bitsery {
}
void setError(ReaderError error) {
return _inputAdapter.setError(error);
if (this->error() == ReaderError::NoError)
_inputAdapter.setError(error);
}
void beginSession() {

View File

@@ -163,9 +163,12 @@ namespace bitsery {
break;
}
}
_posItRef = _endItRef;
//restore end position
_endItRef = _sessionsStack.top();
//modify pointers only if no error or buffer overflow
if (_reader.error() == ReaderError::NoError || _reader.error() == ReaderError::DataOverflow) {
_posItRef = _endItRef;
//restore end position
_endItRef = _sessionsStack.top();
}
_sessionsStack.pop();
}
}

View File

@@ -34,6 +34,11 @@ namespace bitsery {
//forward declare
class PointerLinkingContext;
enum PointerType {
Nullable,
NotNull
};
namespace details_pointer {
enum class PointerOwnershipType:uint8_t {
@@ -263,10 +268,13 @@ namespace bitsery {
class PointerOwner {
public:
explicit PointerOwner(PointerType ptrType = PointerType::Nullable):_ptrType{ptrType} {}
template<typename Ser, typename Writer, typename T, typename Fnc>
void serialize(Ser &ser, Writer &w, const T &obj, Fnc &&) const {
auto& ctx = details_pointer::getLinkingContext(ser);
auto id = ctx.createId(obj, details_pointer::PointerOwnershipType::Owner);
assert(id || _ptrType == PointerType::Nullable);
details::writeSize(w, id);
if (id)
ctx.serialize(ser, obj);
@@ -282,18 +290,27 @@ namespace bitsery {
ctx.deserialize(des, obj);
ctx.processOwnerPtr(id, obj, details_pointer::PointerOwnershipType::Owner);
} else {
details_pointer::destroyPointer(obj);
if (_ptrType == PointerType::Nullable)
details_pointer::destroyPointer(obj);
else
r.setError(ReaderError::InvalidPointer);
}
}
private:
PointerType _ptrType;
};
class PointerObserver {
public:
explicit PointerObserver(PointerType ptrType = PointerType::Nullable):_ptrType{ptrType} {}
template<typename Ser, typename Writer, typename T, typename Fnc>
void serialize(Ser &ser, Writer &w, const T &obj, Fnc &&) const {
auto& ctx = details_pointer::getLinkingContext(ser);
details::writeSize(w, ctx.createId(obj, details_pointer::PointerOwnershipType::Observer));
auto id = ctx.createId(obj, details_pointer::PointerOwnershipType::Observer);
assert(id || _ptrType == PointerType::Nullable);
details::writeSize(w, id);
}
template<typename Des, typename Reader, typename T, typename Fnc>
@@ -304,10 +321,14 @@ namespace bitsery {
auto& ctx = details_pointer::getLinkingContext(des);
ctx.processObserverPtr(id, reinterpret_cast<void*&>(obj));
} else {
obj = nullptr;
if (_ptrType == PointerType::Nullable)
obj = nullptr;
else
r.setError(ReaderError::InvalidPointer);
}
}
private:
PointerType _ptrType;
};
class ReferencedByPointer {