/*
 * SPDX-FileCopyrightText: 2004 Copyright contributors to the cppTango project
 *
 * SPDX-License-Identifier: LGPL-3.0-or-later
 */

#include <tango/server/seq_vec.h>

namespace Tango
{

//
// These functions are not defined within the tango namespace because the VC++
// is not able to understand that the operator overloading functions is defined
// within a namespace x from th eoerand namespace (c++ or aCC is able to
// do it)
//

//=============================================================================
//
//            The sequence print facilities functions
//
// description :    These methods allow an easy way to print all sequence
//            element using the following syntax
//                TANGO_LOG << seq << std::endl;
//
//=============================================================================

std::ostream &operator<<(std::ostream &o, const DevVarCharArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << (short) v[i] << std::dec;
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarShortArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarLongArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarLong64Array &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarFloatArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarDoubleArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarBooleanArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = ";
        if(v[i])
        {
            o << "true";
        }
        else
        {
            o << "false";
        }

        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarUShortArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarULongArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarULong64Array &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarStringArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i].in();
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarStateArray &v)
{
    long nb_elt = v.length();
    for(long i = 0; i < nb_elt; i++)
    {
        o << "Element number [" << i << "] = " << v[i];
        if(i < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}

std::ostream &operator<<(std::ostream &o, const DevVarEncodedArray &v)
{
    long nb_elt = v.length();
    for(long loop = 0; loop < nb_elt; loop++)
    {
        o << "Encoding string: " << v[loop].encoded_format << std::endl;
        long nb_data_elt = v[loop].encoded_data.length();
        for(long i = 0; i < nb_data_elt; i++)
        {
            o << "Data element number [" << i << "] = " << (int) v[loop].encoded_data[i];
            if(i < (nb_data_elt - 1))
            {
                o << '\n';
            }
        }
        if(loop < (nb_elt - 1))
        {
            o << '\n';
        }
    }
    return o;
}
} // namespace Tango
