diff --git a/urdf_parser/include/urdf_parser/exportdecl.h b/urdf_parser/include/urdf_parser/exportdecl.h index e01e783f..c3eeb48d 100644 --- a/urdf_parser/include/urdf_parser/exportdecl.h +++ b/urdf_parser/include/urdf_parser/exportdecl.h @@ -32,53 +32,19 @@ * POSSIBILITY OF SUCH DAMAGE. *********************************************************************/ -/* Author: Thomas Moulard */ - +/* + * This header exists for backwards compatibility. + * Please include exportdecl.hpp instead. + */ #ifndef URDFDOM_EXPORTDECL_H -# define URDFDOM_EXPORTDECL_H +#define URDFDOM_EXPORTDECL_H + +#if defined(_MSC_VER) + #pragma message("warning: urdf_parser/exportdecl.h is deprecated. Please use urdf_parser/exportdecl.hpp instead.") +#else + #warning urdf_parser/exportdecl.h is deprecated. Please use urdf_parser/exportdecl.hpp instead. +#endif -// Handle portable symbol export. -// Defining manually which symbol should be exported is required -// under Windows whether MinGW or MSVC is used. -// -// The headers then have to be able to work in two different modes: -// - dllexport when one is building the library, -// - dllimport for clients using the library. -// -// On Linux, set the visibility accordingly. If C++ symbol visibility -// is handled by the compiler, see: http://gcc.gnu.org/wiki/Visibility -# if defined _WIN32 || defined __CYGWIN__ -// On Microsoft Windows, use dllimport and dllexport to tag symbols. -# define URDFDOM_DLLIMPORT __declspec(dllimport) -# define URDFDOM_DLLEXPORT __declspec(dllexport) -# define URDFDOM_DLLLOCAL -# else -// On Linux, for GCC >= 4, tag symbols using GCC extension. -# if __GNUC__ >= 4 -# define URDFDOM_DLLIMPORT __attribute__ ((visibility("default"))) -# define URDFDOM_DLLEXPORT __attribute__ ((visibility("default"))) -# define URDFDOM_DLLLOCAL __attribute__ ((visibility("hidden"))) -# else -// Otherwise (GCC < 4 or another compiler is used), export everything. -# define URDFDOM_DLLIMPORT -# define URDFDOM_DLLEXPORT -# define URDFDOM_DLLLOCAL -# endif // __GNUC__ >= 4 -# endif // defined _WIN32 || defined __CYGWIN__ +#include -# ifdef URDFDOM_STATIC -// If one is using the library statically, get rid of -// extra information. -# define URDFDOM_DLLAPI -# define URDFDOM_LOCAL -# else -// Depending on whether one is building or using the -// library define DLLAPI to import or export. -# ifdef URDFDOM_EXPORTS -# define URDFDOM_DLLAPI URDFDOM_DLLEXPORT -# else -# define URDFDOM_DLLAPI URDFDOM_DLLIMPORT -# endif // URDFDOM_EXPORTS -# define URDFDOM_LOCAL URDFDOM_DLLLOCAL -# endif // URDFDOM_STATIC #endif //! URDFDOM_EXPORTDECL_H diff --git a/urdf_parser/include/urdf_parser/exportdecl.hpp b/urdf_parser/include/urdf_parser/exportdecl.hpp new file mode 100644 index 00000000..4e08b109 --- /dev/null +++ b/urdf_parser/include/urdf_parser/exportdecl.hpp @@ -0,0 +1,84 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +/* Author: Thomas Moulard */ + +#ifndef URDFDOM_EXPORTDECL_HPP +#define URDFDOM_EXPORTDECL_HPP + +// Handle portable symbol export. +// Defining manually which symbol should be exported is required +// under Windows whether MinGW or MSVC is used. +// +// The headers then have to be able to work in two different modes: +// - dllexport when one is building the library, +// - dllimport for clients using the library. +// +// On Linux, set the visibility accordingly. If C++ symbol visibility +// is handled by the compiler, see: http://gcc.gnu.org/wiki/Visibility +# if defined _WIN32 || defined __CYGWIN__ +// On Microsoft Windows, use dllimport and dllexport to tag symbols. +# define URDFDOM_DLLIMPORT __declspec(dllimport) +# define URDFDOM_DLLEXPORT __declspec(dllexport) +# define URDFDOM_DLLLOCAL +# else +// On Linux, for GCC >= 4, tag symbols using GCC extension. +# if __GNUC__ >= 4 +# define URDFDOM_DLLIMPORT __attribute__ ((visibility("default"))) +# define URDFDOM_DLLEXPORT __attribute__ ((visibility("default"))) +# define URDFDOM_DLLLOCAL __attribute__ ((visibility("hidden"))) +# else +// Otherwise (GCC < 4 or another compiler is used), export everything. +# define URDFDOM_DLLIMPORT +# define URDFDOM_DLLEXPORT +# define URDFDOM_DLLLOCAL +# endif // __GNUC__ >= 4 +# endif // defined _WIN32 || defined __CYGWIN__ + +# ifdef URDFDOM_STATIC +// If one is using the library statically, get rid of +// extra information. +# define URDFDOM_DLLAPI +# define URDFDOM_LOCAL +# else +// Depending on whether one is building or using the +// library define DLLAPI to import or export. +# ifdef URDFDOM_EXPORTS +# define URDFDOM_DLLAPI URDFDOM_DLLEXPORT +# else +# define URDFDOM_DLLAPI URDFDOM_DLLIMPORT +# endif // URDFDOM_EXPORTS +# define URDFDOM_LOCAL URDFDOM_DLLLOCAL +# endif // URDFDOM_STATIC +#endif //! URDFDOM_EXPORTDECL_HPP diff --git a/urdf_parser/include/urdf_parser/urdf_parser.h b/urdf_parser/include/urdf_parser/urdf_parser.h index 70d5f543..40a4b63b 100644 --- a/urdf_parser/include/urdf_parser/urdf_parser.h +++ b/urdf_parser/include/urdf_parser/urdf_parser.h @@ -32,148 +32,19 @@ * POSSIBILITY OF SUCH DAMAGE. *********************************************************************/ -/* Author: Wim Meeussen */ - +/* + * This header exists for backwards compatibility. + * Please include urdf_parser.hpppp instead. + */ #ifndef URDF_PARSER_URDF_PARSER_H #define URDF_PARSER_URDF_PARSER_H -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "exportdecl.h" - -namespace tinyxml2{ - // Forward declaration for APIs that use TinyXML2 structures. - // That way, we don't have to export a TinyXML2 dependency. - class XMLDocument; - class XMLElement; -} - -namespace urdf_export_helpers { - -URDFDOM_DLLAPI std::string values2str(unsigned int count, const double *values, double (*conv)(double) = NULL); -URDFDOM_DLLAPI std::string values2str(urdf::Vector3 vec); -URDFDOM_DLLAPI std::string values2str(urdf::Rotation rot); -URDFDOM_DLLAPI std::string values2str(urdf::Color c); -URDFDOM_DLLAPI std::string values2str(double d); - -// This lives here (rather than in model.cpp) so we can run tests on it. -class URDFVersion final -{ -public: - explicit URDFVersion(const char *attr) - { - // If the passed in attribute is NULL, it means it wasn't specified in the - // XML, so we just assume version 1.0. - if (attr == nullptr) - { - major_ = 1; - minor_ = 0; - return; - } - - // We only accept version strings of the type . - std::vector split; - urdf::split_string(split, std::string(attr), "."); - if (split.size() == 2) - { - major_ = strToUnsigned(split[0].c_str()); - minor_ = strToUnsigned(split[1].c_str()); - } - else - { - throw std::runtime_error("The version attribute should be in the form 'x.y'"); - } - } - - explicit URDFVersion(uint32_t major, uint32_t minor) - : major_(major), minor_(minor) - {} - - bool equal(uint32_t maj, uint32_t min) - { - return this->major_ == maj && this->minor_ == min; - } - - // equivalent to greater or equal >= - bool at_least(uint32_t maj, uint32_t min) const - { - return this->major_ > maj || (this->major_ == maj && this->minor_ >= min); - } - - // equivalent to lesser or equal <= - bool at_most(uint32_t maj, uint32_t min) const - { - return this->major_ < maj || (this->major_ == maj && this->minor_ <= min); - } - - bool greater_than(uint32_t maj, uint32_t min) const - { - return this->major_ > maj || (this->major_ == maj && this->minor_ > min); - } - - bool less_than(uint32_t maj, uint32_t min) const - { - return this->major_ < maj || (this->major_ == maj && this->minor_ < min); - } - - uint32_t getMajor() const - { - return major_; - } - - uint32_t getMinor() const - { - return minor_; - } - -private: - uint32_t strToUnsigned(const char *str) - { - if (str[0] == '\0') - { - // This would get caught below, but we can make a nicer error message - throw std::runtime_error("One of the fields of the version attribute is blank"); - } - char *end = const_cast(str); - long value = strtol(str, &end, 10); - if (end == str) - { - // If the pointer didn't move at all, then we couldn't convert any of - // the string to an integer. - throw std::runtime_error("Version attribute is not an integer"); - } - if (*end != '\0') - { - // Here, we didn't go all the way to the end of the string, which - // means there was junk at the end - throw std::runtime_error("Extra characters after the version number"); - } - if (value < 0) - { - throw std::runtime_error("Version number must be positive"); - } - - return value; - } - - uint32_t major_; - uint32_t minor_; -}; - -} +#if defined(_MSC_VER) + #pragma message("warning: urdf_parser/urdf_parser.h is deprecated. Please use urdf_parser/urdf_parser.hpp instead.") +#else + #warning urdf_parser/urdf_parser.h is deprecated. Please use urdf_parser/urdf_parser.hpp instead. +#endif -namespace urdf{ - URDFDOM_DLLAPI ModelInterfaceSharedPtr parseURDF(const std::string &xml_string); - URDFDOM_DLLAPI ModelInterfaceSharedPtr parseURDFFile(const std::string &path); -} +#include -#endif +#endif // URDF_PARSER_URDF_PARSER_H diff --git a/urdf_parser/include/urdf_parser/urdf_parser.hpp b/urdf_parser/include/urdf_parser/urdf_parser.hpp new file mode 100644 index 00000000..dbbd194e --- /dev/null +++ b/urdf_parser/include/urdf_parser/urdf_parser.hpp @@ -0,0 +1,179 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#ifndef URDF_PARSER_URDF_PARSER_HPP +#define URDF_PARSER_URDF_PARSER_HPP + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "exportdecl.hpp" + +namespace tinyxml2{ + // Forward declaration for APIs that use TinyXML2 structures. + // That way, we don't have to export a TinyXML2 dependency. + class XMLDocument; + class XMLElement; +} + +namespace urdf_export_helpers { + +URDFDOM_DLLAPI std::string values2str(unsigned int count, const double *values, double (*conv)(double) = NULL); +URDFDOM_DLLAPI std::string values2str(urdf::Vector3 vec); +URDFDOM_DLLAPI std::string values2str(urdf::Rotation rot); +URDFDOM_DLLAPI std::string values2str(urdf::Color c); +URDFDOM_DLLAPI std::string values2str(double d); + +// This lives here (rather than in model.cpp) so we can run tests on it. +class URDFVersion final +{ +public: + explicit URDFVersion(const char *attr) + { + // If the passed in attribute is NULL, it means it wasn't specified in the + // XML, so we just assume version 1.0. + if (attr == nullptr) + { + major_ = 1; + minor_ = 0; + return; + } + + // We only accept version strings of the type . + std::vector split; + urdf::split_string(split, std::string(attr), "."); + if (split.size() == 2) + { + major_ = strToUnsigned(split[0].c_str()); + minor_ = strToUnsigned(split[1].c_str()); + } + else + { + throw std::runtime_error("The version attribute should be in the form 'x.y'"); + } + } + + explicit URDFVersion(uint32_t major, uint32_t minor) + : major_(major), minor_(minor) + {} + + bool equal(uint32_t maj, uint32_t min) + { + return this->major_ == maj && this->minor_ == min; + } + + // equivalent to greater or equal >= + bool at_least(uint32_t maj, uint32_t min) const + { + return this->major_ > maj || (this->major_ == maj && this->minor_ >= min); + } + + // equivalent to lesser or equal <= + bool at_most(uint32_t maj, uint32_t min) const + { + return this->major_ < maj || (this->major_ == maj && this->minor_ <= min); + } + + bool greater_than(uint32_t maj, uint32_t min) const + { + return this->major_ > maj || (this->major_ == maj && this->minor_ > min); + } + + bool less_than(uint32_t maj, uint32_t min) const + { + return this->major_ < maj || (this->major_ == maj && this->minor_ < min); + } + + uint32_t getMajor() const + { + return major_; + } + + uint32_t getMinor() const + { + return minor_; + } + +private: + uint32_t strToUnsigned(const char *str) + { + if (str[0] == '\0') + { + // This would get caught below, but we can make a nicer error message + throw std::runtime_error("One of the fields of the version attribute is blank"); + } + char *end = const_cast(str); + long value = strtol(str, &end, 10); + if (end == str) + { + // If the pointer didn't move at all, then we couldn't convert any of + // the string to an integer. + throw std::runtime_error("Version attribute is not an integer"); + } + if (*end != '\0') + { + // Here, we didn't go all the way to the end of the string, which + // means there was junk at the end + throw std::runtime_error("Extra characters after the version number"); + } + if (value < 0) + { + throw std::runtime_error("Version number must be positive"); + } + + return value; + } + + uint32_t major_; + uint32_t minor_; +}; + +} + +namespace urdf{ + URDFDOM_DLLAPI ModelInterfaceSharedPtr parseURDF(const std::string &xml_string); + URDFDOM_DLLAPI ModelInterfaceSharedPtr parseURDFFile(const std::string &path); +} + +#endif // URDF_PARSER_URDF_PARSER_HPP diff --git a/urdf_parser/src/check_urdf.cpp b/urdf_parser/src/check_urdf.cpp index 292e6d20..33572ef7 100644 --- a/urdf_parser/src/check_urdf.cpp +++ b/urdf_parser/src/check_urdf.cpp @@ -34,7 +34,7 @@ /* Author: Wim Meeussen */ -#include "urdf_parser/urdf_parser.h" +#include "urdf_parser/urdf_parser.hpp" #include #include diff --git a/urdf_parser/src/joint.cpp b/urdf_parser/src/joint.cpp index 8580cb15..f0745bd4 100644 --- a/urdf_parser/src/joint.cpp +++ b/urdf_parser/src/joint.cpp @@ -38,10 +38,10 @@ #include #include #include -#include +#include #include #include -#include +#include #include "./pose.hpp" diff --git a/urdf_parser/src/link.cpp b/urdf_parser/src/link.cpp index e7cbdf18..672f1470 100644 --- a/urdf_parser/src/link.cpp +++ b/urdf_parser/src/link.cpp @@ -35,8 +35,8 @@ /* Author: Wim Meeussen */ -#include -#include +#include +#include #include #include #include diff --git a/urdf_parser/src/model.cpp b/urdf_parser/src/model.cpp index 2998827f..a5dd2086 100644 --- a/urdf_parser/src/model.cpp +++ b/urdf_parser/src/model.cpp @@ -38,7 +38,7 @@ #include #include #include -#include "urdf_parser/urdf_parser.h" +#include "urdf_parser/urdf_parser.hpp" #include #include diff --git a/urdf_parser/src/pose.cpp b/urdf_parser/src/pose.cpp index d82c3e54..36cf009c 100644 --- a/urdf_parser/src/pose.cpp +++ b/urdf_parser/src/pose.cpp @@ -35,13 +35,13 @@ /* Author: Wim Meeussen, John Hsu */ -#include +#include #include #include #include #include #include -#include +#include #include "./pose.hpp" diff --git a/urdf_parser/src/pose.hpp b/urdf_parser/src/pose.hpp index 38e05192..14ce16ec 100644 --- a/urdf_parser/src/pose.hpp +++ b/urdf_parser/src/pose.hpp @@ -34,10 +34,10 @@ /* Author: Wim Meeussen, John Hsu */ -#include +#include #include -#include "urdf_parser/urdf_parser.h" +#include "urdf_parser/urdf_parser.hpp" namespace urdf { diff --git a/urdf_parser/src/urdf_sensor.cpp b/urdf_parser/src/urdf_sensor.cpp index 7ce30d77..36751bec 100644 --- a/urdf_parser/src/urdf_sensor.cpp +++ b/urdf_parser/src/urdf_sensor.cpp @@ -35,7 +35,7 @@ /* Author: John Hsu */ -#include +#include #include #include #include @@ -45,7 +45,7 @@ #include #include -#include +#include #include "./pose.hpp" #include "./urdf_sensor.hpp" diff --git a/urdf_parser/src/urdf_to_graphviz.cpp b/urdf_parser/src/urdf_to_graphviz.cpp index e97c3df8..1601270d 100644 --- a/urdf_parser/src/urdf_to_graphviz.cpp +++ b/urdf_parser/src/urdf_to_graphviz.cpp @@ -34,7 +34,7 @@ /* Author: Wim Meeussen */ -#include "urdf_parser/urdf_parser.h" +#include "urdf_parser/urdf_parser.hpp" #include #include diff --git a/urdf_parser/src/world.cpp b/urdf_parser/src/world.cpp index 4aa6e3a9..e017d78a 100644 --- a/urdf_parser/src/world.cpp +++ b/urdf_parser/src/world.cpp @@ -35,9 +35,9 @@ /* Author: Wim Meeussen */ -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/urdf_parser/test/memtest.cpp b/urdf_parser/test/memtest.cpp index 86d231ea..8bd68890 100644 --- a/urdf_parser/test/memtest.cpp +++ b/urdf_parser/test/memtest.cpp @@ -1,4 +1,4 @@ -#include "urdf_parser/urdf_parser.h" +#include "urdf_parser/urdf_parser.hpp" #include #include diff --git a/urdf_parser/test/urdf_schema_capsule_geometry_test.cpp b/urdf_parser/test/urdf_schema_capsule_geometry_test.cpp index b586a5d0..fd7857e5 100644 --- a/urdf_parser/test/urdf_schema_capsule_geometry_test.cpp +++ b/urdf_parser/test/urdf_schema_capsule_geometry_test.cpp @@ -17,7 +17,7 @@ #include #include "urdf_model/link.h" -#include "urdf_parser/urdf_parser.h" +#include "urdf_parser/urdf_parser.hpp" TEST(URDF_UNIT_TEST, parse_capsule_geometry_version_1_1) { diff --git a/urdf_parser/test/urdf_schema_quaternion_test.cpp b/urdf_parser/test/urdf_schema_quaternion_test.cpp index c1993743..004bca59 100644 --- a/urdf_parser/test/urdf_schema_quaternion_test.cpp +++ b/urdf_parser/test/urdf_schema_quaternion_test.cpp @@ -4,8 +4,8 @@ #include #include -#include "urdf_model/pose.h" -#include "urdf_parser/urdf_parser.h" +#include "urdf_model/pose.hpp" +#include "urdf_parser/urdf_parser.hpp" TEST(URDF_UNIT_TEST, parse_rot_rpy_version_1_0) { diff --git a/urdf_parser/test/urdf_unit_test.cpp b/urdf_parser/test/urdf_unit_test.cpp index 6e8d87e1..654d39c5 100644 --- a/urdf_parser/test/urdf_unit_test.cpp +++ b/urdf_parser/test/urdf_unit_test.cpp @@ -4,8 +4,8 @@ #include #include -#include "urdf_model/pose.h" -#include "urdf_parser/urdf_parser.h" +#include "urdf_model/pose.hpp" +#include "urdf_parser/urdf_parser.hpp" #ifndef M_PI # define M_PI 3.141592653589793 diff --git a/urdf_parser/test/urdf_version_test.cpp b/urdf_parser/test/urdf_version_test.cpp index e28a084a..a9f790d2 100644 --- a/urdf_parser/test/urdf_version_test.cpp +++ b/urdf_parser/test/urdf_version_test.cpp @@ -3,7 +3,7 @@ #include -#include +#include #define EXPECT_THROW_OF_TYPE(type, statement, msg) \ do { \