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