Sun, 02 Feb 2020 00:30:48 +0200
added automated configuration collection
/* * LDForge: LDraw parts authoring CAD * Copyright (C) 2013 - 2020 Teemu Piippo * * 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/>. */ #pragma once #include "basics.h" namespace utility { template<typename T, std::size_t N> constexpr std::size_t countof(T(&)[N]) { return N; } // http://stackoverflow.com/a/18204188/3629665 template<typename T> inline T rotl10(T x) { return (x << 10) | ((x >> 22) & 0x000000ff); } template<typename T> inline T rotl20(T x) { return (x << 20) | ((x >> 12) & 0x000000ff); } inline QString format(const QString& format_string) { return format_string; } template<typename T, typename... Rest> QString format(const QString& format_string, T&& arg, Rest&&... rest) { return format(format_string.arg(arg), std::forward<Rest>(rest)...); } inline QString quoted(QString string) { if (string.contains("'")) { string.replace("\"", "\\\""); string = "\"" + string + "\""; } else { string = "'" + string + "'"; } return string; } template<typename T, typename R> bool contains(T&& container, R&& value) { return std::find(std::begin(container), std::end(container), value) != std::end(container); } inline QString vertexToStringParens(const glm::vec3& vertex) { return utility::format("(%1, %2, %3)", vertex.x, vertex.y, vertex.z); } }