Memory.h
// Memory.h
//
// Author David Barrett-Lennard
// (C)opyright Cedanet Pty Ltd 2019
@import "IObject.h"
@import "IObjectVisitor.h"
#include <memory> // for std::unique_ptr and std::shared_ptr
// std::optional doesn't seem to be available in the Android NDK r19
#ifndef __ANDROID__
#include <optional> // for std::optional
#endif
#include <utility> // for std::pair
namespace ceda
{
///////////////////////////////////////////////////////////////////////////////////////////////////
// std::pair
// This appears in Ceda/cxUtils/ListToOStream.h
/*
template <typename U, typename V>
xostream& operator<<(xostream& os, const std::pair<U,V>& p)
{
os << '(' << p.first << ',' << p.second << ')';
return os;
}
*/
// This appears in Ceda/cxObject/IObjectVisitor.h
/*
template <typename U, typename V>
IObjectVisitor& operator<<(IObjectVisitor& v, const std::pair<U,V>& x)
{
v << x.first << x.second;
return v;
}
*/
// This appears in Ceda/cxPersistStore/IPrefVisitor.h
/*
template <typename U, typename V>
IPrefVisitor& operator<<(IPrefVisitor& v, const std::pair<U,V>& x)
{
v << x.first << x.second;
return v;
}
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
// std::optional
// std::optional doesn't seem to be available in the Android NDK r19
#ifndef __ANDROID__
template<typename T>
IObjectVisitor& operator<<(IObjectVisitor& v, const std::optional<T>& opt)
{
if (opt) v << opt.value();
return v;
}
template <typename T>
xostream& operator<<(xostream& os, const std::optional<T>& opt)
{
if (opt) os << opt.value(); else os << "none";
return os;
}
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////
// std::unique_ptr
template<typename T>
IObjectVisitor& operator<<(IObjectVisitor& v, const std::unique_ptr<T>& s)
{
if (s) v << *s;
return v;
}
template<typename T>
xostream& operator<<(xostream& os, const std::unique_ptr<T>& s)
{
if (s) os << *s; else os << "null";
return os;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// std::shared_ptr
template<typename T>
IObjectVisitor& operator<<(IObjectVisitor& v, const std::shared_ptr<T>& s)
{
if (s) v << *s;
return v;
}
template<typename T>
xostream& operator<<(xostream& os, const std::shared_ptr<T>& s)
{
if (s) os << *s; else os << "null";
return os;
}
} // namespace ceda