mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2024-11-22 09:45:01 +00:00
c99a4f4d85
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.
235 lines
8.4 KiB
C++
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_
|