7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2024-11-22 09:45:01 +00:00
kicad/thirdparty/3dxware_sdk/inc/navlib/navlib_ostream.h
markus-bonk c99a4f4d85 Include the required third party code for the SpaceMouse implementation
The commit only adds the headers and code required by the SpaceMouse
implementation to compile and link. This extract from the 3Dconnexion
SDK is added to the third party directory to allow developers to build without
needing to acquire a cmake enabled version.
2022-01-28 12:21:42 +00:00

235 lines
8.4 KiB
C++

#ifndef NAVLIB_OSTREAM_INCLUDED_
#define NAVLIB_OSTREAM_INCLUDED_
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (c) 2014-2021 3Dconnexion.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file navlib_ostream.h
* @brief stream operators for the navlib types.
*/
#include <navlib/navlib_types.h>
// C++ convenience functions
#include <iomanip>
#include <limits>
#include <ostream>
#include <string>
_NAVLIB_BEGIN
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const vector_t &vector) {
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1);
stream << "[" << vector.x << ", " << vector.y << ", " << vector.z << "]";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const point_t &position) {
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1);
stream << "[" << position.x << ", " << position.y << ", " << position.z << "]";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const plane_t &plane) {
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1);
stream << "[" << plane.x << ", " << plane.y << ", " << plane.z << ", " << plane.d << "]";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const box_t &box) {
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1);
stream << box.min << ", " << box.max;
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const frustum_t &frustum) {
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1);
stream << "[" << frustum.left << ", " << frustum.right << ", " << frustum.bottom << ", "
<< frustum.top << ", " << frustum.nearVal << ", " << frustum.farVal << "]";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const matrix_t &matrix) {
stream << std::endl;
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1);
stream << "\t[" << matrix.m00 << ", " << matrix.m01 << ", " << matrix.m02 << ", " << matrix.m03
<< "]" << std::endl;
stream << "\t[" << matrix.m10 << ", " << matrix.m11 << ", " << matrix.m12 << ", " << matrix.m13
<< "]" << std::endl;
stream << "\t[" << matrix.m20 << ", " << matrix.m21 << ", " << matrix.m22 << ", " << matrix.m23
<< "]" << std::endl;
stream << "\t[" << matrix.m30 << ", " << matrix.m31 << ", " << matrix.m32 << ", " << matrix.m33
<< "]";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const struct siResource_s &resource) {
stream << "{file_name: " << (resource.file_name ? resource.file_name : "nullptr")
<< ", id: " << (resource.id ? resource.id : "nullptr")
<< ", type: " << (resource.type ? resource.type : "nullptr")
<< ", index: " << resource.index << "}";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const struct siImageFile_s &file) {
stream << "{file_name: " << (file.file_name ? file.file_name : "nullptr")
<< ", index: " << file.index << "}";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const struct siImageData_s &image) {
stream << "{data: 0x" << std::hex << reinterpret_cast<uintptr_t>(image.data) << std::dec
<< ", size: " << image.size << ", index: " << image.index << "}";
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const imagearray_t &images) {
stream << "count: " << images.count;
std::string indent("\n");
indent.resize(5, ' ');
for (size_t i = 0; i < images.count; ++i) {
SiImage_t const &image = images.p[i];
stream << indent << "{size: " << image.size << ", id: " << (image.id ? image.id : "nullptr");
if (image.type == e_image_file)
stream << ", type: e_image_file, " << image.file;
else if (image.type == e_resource_file)
stream << ", type: e_resource_file, " << image.resource;
if (image.type == e_image)
stream << ", type: e_image, " << image.image;
else
stream << ", type: e_none";
stream << "}";
}
return stream;
}
template <class _Elem, class _Traits>
void StreamActionNodeHeader(std::basic_ostream<_Elem, _Traits> &stream,
const SiActionNodeEx_t &node, size_t level) {
std::string indent("\n");
indent.resize(4 * level + 1, ' ');
stream << indent << "{size: " << node.size << ", type: " << node.type
<< ", id: " << (node.id ? node.id : "nullptr")
<< ", label: " << (node.label ? node.label : "nullptr")
<< ", description: " << (node.description ? node.description : "nullptr") << "}";
if (node.children != NULL)
StreamActionNodeHeader(stream, *node.children, level + 1);
if (node.next != NULL)
StreamActionNodeHeader(stream, *node.next, level);
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const SiActionNodeEx_t &node) {
StreamActionNodeHeader(stream, node, 1);
return stream;
}
template <class _Elem, class _Traits>
std::basic_ostream<_Elem, _Traits> &operator<<(std::basic_ostream<_Elem, _Traits> &stream,
const value_t &value) {
try {
switch (value.type) {
case voidptr_type:
stream << value.p;
break;
case bool_type:
stream << (value.b ? "true" : "false");
break;
case long_type:
stream << value.l;
break;
case float_type:
stream << std::setprecision(std::numeric_limits<float>::digits10 + 1) << value.f;
break;
case double_type:
stream << std::setprecision(std::numeric_limits<double>::digits10 + 2) << value.d;
break;
case point_type:
stream << value.point;
break;
case vector_type:
stream << value.vector;
break;
case matrix_type:
stream << value.matrix;
break;
case string_type:
if (value.string.p)
stream << value.string.p;
else
stream << "empty";
break;
case actionnodeexptr_type:
stream << *value.pnode;
break;
case imagearray_type:
stream << value.imagearray;
break;
case plane_type:
stream << value.plane;
break;
case box_type:
stream << value.box;
break;
case frustum_type:
stream << value.frustum;
break;
case cstr_type:
if (value.cstr_.p)
stream << value.cstr_.p;
else
stream << "empty";
break;
default:
stream << "null";
break;
}
} catch (std::runtime_error &e) {
stream << "std::runtime_error " << e.what();
}
return stream;
}
_NAVLIB_END
#endif // NAVLIB_OSTREAM_INCLUDED_