Ptential Fix for VS2015 compile fail #27

This commit is contained in:
Arun M 2018-10-03 22:07:08 +05:30
parent e5ecca4f38
commit 64de7b6f1d
5 changed files with 78 additions and 25 deletions

View file

@ -47,6 +47,7 @@ SOFTWARE.
#include "jwt/string_view.hpp" #include "jwt/string_view.hpp"
#include "jwt/error_codes.hpp" #include "jwt/error_codes.hpp"
#include "jwt/base64.hpp" #include "jwt/base64.hpp"
#include "jwt/config.hpp"
namespace jwt { namespace jwt {
@ -220,7 +221,7 @@ enum class algorithm
* Convert the algorithm enum class type to * Convert the algorithm enum class type to
* its stringified form. * its stringified form.
*/ */
inline jwt::string_view alg_to_str(enum algorithm alg) noexcept inline jwt::string_view alg_to_str(SCOPED_ENUM algorithm alg) noexcept
{ {
switch (alg) { switch (alg) {
case algorithm::HS256: return "HS256"; case algorithm::HS256: return "HS256";
@ -245,7 +246,7 @@ inline jwt::string_view alg_to_str(enum algorithm alg) noexcept
* Convert stringified algorithm to enum class. * Convert stringified algorithm to enum class.
* The string comparison is case insesitive. * The string comparison is case insesitive.
*/ */
inline enum algorithm str_to_alg(const jwt::string_view alg) noexcept inline SCOPED_ENUM algorithm str_to_alg(const jwt::string_view alg) noexcept
{ {
if (!alg.length()) return algorithm::NONE; if (!alg.length()) return algorithm::NONE;

View file

@ -27,6 +27,7 @@ SOFTWARE.
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>
#include <ostream> #include <ostream>
#include "jwt/config.hpp"
#include "jwt/string_view.hpp" #include "jwt/string_view.hpp"
namespace jwt { namespace jwt {
@ -61,8 +62,7 @@ public:
public: public:
constexpr char at(size_t pos) const noexcept constexpr char at(size_t pos) const noexcept
{ {
assert (pos < chars_.size()); return X_ASSERT(pos < chars_.size()), chars_.at(pos);
return chars_.at(pos);
} }
private: private:
@ -155,8 +155,7 @@ public:
public: public:
constexpr char at(size_t pos) const noexcept constexpr char at(size_t pos) const noexcept
{ {
assert (pos < map_.size()); return X_ASSERT(pos < map_.size()), map_[pos];
return map_[pos];
} }
private: private:

51
include/jwt/config.hpp Normal file
View file

@ -0,0 +1,51 @@
/*
Copyright (c) 2018 Arun Muralidharan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef CPP_JWT_CONFIG_HPP
#define CPP_JWT_CONFIG_HPP
#ifdef _MSC_VER
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#endif
// To hack around Visual Studio error:
// error C3431: 'algorithm': a scoped enumeration cannot be redeclared as an unscoped enumeration
#ifdef _MSC_VER
#define SCOPED_ENUM enum class
#else
#define SCOPED_ENUM enum
#endif
// To hack around Visual Studio error
// error C3249: illegal statement or sub-expression for 'constexpr' function
// Doesn't allow assert to be part of constexpr functions.
// Copied the solution as described in:
// https://akrzemi1.wordpress.com/2017/05/18/asserts-in-constexpr-functions/
#if defined NDEBUG
# define X_ASSERT(CHECK) void(0)
#else
# define X_ASSERT(CHECK) \
( (CHECK) ? void(0) : []{assert(!#CHECK);}() )
#endif
#endif

View file

@ -23,6 +23,7 @@ SOFTWARE.
#ifndef JWT_IPP #ifndef JWT_IPP
#define JWT_IPP #define JWT_IPP
#include "jwt/config.hpp"
#include "jwt/detail/meta.hpp" #include "jwt/detail/meta.hpp"
#include <algorithm> #include <algorithm>

View file

@ -32,6 +32,7 @@ SOFTWARE.
#include <cstring> #include <cstring>
#include "jwt/base64.hpp" #include "jwt/base64.hpp"
#include "jwt/config.hpp"
#include "jwt/algorithm.hpp" #include "jwt/algorithm.hpp"
#include "jwt/string_view.hpp" #include "jwt/string_view.hpp"
#include "jwt/parameters.hpp" #include "jwt/parameters.hpp"
@ -75,7 +76,7 @@ inline enum type str_to_type(const jwt::string_view typ) noexcept
* Converts an instance of type `enum class type` * Converts an instance of type `enum class type`
* to its string equivalent. * to its string equivalent.
*/ */
inline jwt::string_view type_to_str(enum type typ) inline jwt::string_view type_to_str(SCOPED_ENUM type typ)
{ {
switch (typ) { switch (typ) {
case type::JWT: return "JWT"; case type::JWT: return "JWT";
@ -112,7 +113,7 @@ enum class registered_claims
* Converts an instance of type `enum class registered_claims` * Converts an instance of type `enum class registered_claims`
* to its string equivalent representation. * to its string equivalent representation.
*/ */
inline jwt::string_view reg_claims_to_str(enum registered_claims claim) noexcept inline jwt::string_view reg_claims_to_str(SCOPED_ENUM registered_claims claim) noexcept
{ {
switch (claim) { switch (claim) {
case registered_claims::expiration: return "exp"; case registered_claims::expiration: return "exp";
@ -296,7 +297,7 @@ public: // 'tors
* Constructor taking specified algorithm type * Constructor taking specified algorithm type
* and JWT type. * and JWT type.
*/ */
jwt_header(enum algorithm alg, enum type typ = type::JWT) jwt_header(SCOPED_ENUM algorithm alg, SCOPED_ENUM type typ = type::JWT)
: alg_(alg) : alg_(alg)
, typ_(typ) , typ_(typ)
{ {
@ -326,7 +327,7 @@ public: // Exposed APIs
/** /**
* Set the algorithm. * Set the algorithm.
*/ */
void algo(enum algorithm alg) void algo(SCOPED_ENUM algorithm alg)
{ {
alg_ = alg; alg_ = alg;
payload_["alg"] = alg_to_str(alg_).to_string(); payload_["alg"] = alg_to_str(alg_).to_string();
@ -344,7 +345,7 @@ public: // Exposed APIs
/** /**
* Get the algorithm. * Get the algorithm.
*/ */
enum algorithm algo() const noexcept SCOPED_ENUM algorithm algo() const noexcept
{ {
return alg_; return alg_;
} }
@ -356,7 +357,7 @@ public: // Exposed APIs
/** /**
* Set the JWT type. * Set the JWT type.
*/ */
void typ(enum type typ) noexcept void typ(SCOPED_ENUM type typ) noexcept
{ {
typ_ = typ; typ_ = typ;
payload_["typ"] = type_to_str(typ_).to_string(); payload_["typ"] = type_to_str(typ_).to_string();
@ -374,7 +375,7 @@ public: // Exposed APIs
/** /**
* Get the JWT type. * Get the JWT type.
*/ */
enum type typ() const noexcept SCOPED_ENUM type typ() const noexcept
{ {
return typ_; return typ_;
} }
@ -489,10 +490,10 @@ public: // Exposed APIs
private: // Data members private: // Data members
/// The Algorithm to use for signature creation /// The Algorithm to use for signature creation
enum algorithm alg_ = algorithm::NONE; SCOPED_ENUM algorithm alg_ = algorithm::NONE;
/// The type of header /// The type of header
enum type typ_ = type::JWT; SCOPED_ENUM type typ_ = type::JWT;
// The JSON payload object // The JSON payload object
json_t payload_; json_t payload_;
@ -602,7 +603,7 @@ public: // Exposed APIs
!std::is_same<std::decay_t<T>, system_time_t>::value || !std::is_same<std::decay_t<T>, system_time_t>::value ||
!std::is_same<std::decay_t<T>, jwt::string_view>::value !std::is_same<std::decay_t<T>, jwt::string_view>::value
>> >>
bool add_claim(enum registered_claims cname, T&& cvalue, bool overwrite=false) bool add_claim(SCOPED_ENUM registered_claims cname, T&& cvalue, bool overwrite=false)
{ {
return add_claim( return add_claim(
reg_claims_to_str(cname), reg_claims_to_str(cname),
@ -616,7 +617,7 @@ public: // Exposed APIs
* This overload takes `registered_claims` as the claim name and * This overload takes `registered_claims` as the claim name and
* `system_time_t` as the claim value type. * `system_time_t` as the claim value type.
*/ */
bool add_claim(enum registered_claims cname, system_time_t tp, bool overwrite=false) bool add_claim(SCOPED_ENUM registered_claims cname, system_time_t tp, bool overwrite=false)
{ {
return add_claim( return add_claim(
reg_claims_to_str(cname), reg_claims_to_str(cname),
@ -631,7 +632,7 @@ public: // Exposed APIs
* This overload takes `registered_claims` as the claim name and * This overload takes `registered_claims` as the claim name and
* `jwt::string_view` as the claim value type. * `jwt::string_view` as the claim value type.
*/ */
bool add_claim(enum registered_claims cname, jwt::string_view cvalue, bool overwrite=false) bool add_claim(SCOPED_ENUM registered_claims cname, jwt::string_view cvalue, bool overwrite=false)
{ {
return add_claim( return add_claim(
reg_claims_to_str(cname), reg_claims_to_str(cname),
@ -664,7 +665,7 @@ public: // Exposed APIs
* JSON library will throw an exception. * JSON library will throw an exception.
*/ */
template <typename T> template <typename T>
decltype(auto) get_claim_value(enum registered_claims cname) const decltype(auto) get_claim_value(SCOPED_ENUM registered_claims cname) const
{ {
return get_claim_value<T>(reg_claims_to_str(cname)); return get_claim_value<T>(reg_claims_to_str(cname));
} }
@ -688,7 +689,7 @@ public: // Exposed APIs
* Overload which takes the claim name as an instance * Overload which takes the claim name as an instance
* of `registered_claims` type. * of `registered_claims` type.
*/ */
bool remove_claim(enum registered_claims cname) bool remove_claim(SCOPED_ENUM registered_claims cname)
{ {
return remove_claim(reg_claims_to_str(cname)); return remove_claim(reg_claims_to_str(cname));
} }
@ -712,7 +713,7 @@ public: // Exposed APIs
* Overload which takes the claim name as an instance * Overload which takes the claim name as an instance
* of `registered_claims` type. * of `registered_claims` type.
*/ */
bool has_claim(enum registered_claims cname) const noexcept bool has_claim(SCOPED_ENUM registered_claims cname) const noexcept
{ {
return has_claim(reg_claims_to_str(cname)); return has_claim(reg_claims_to_str(cname));
} }
@ -737,7 +738,7 @@ public: // Exposed APIs
* type `registered_claims`. * type `registered_claims`.
*/ */
template <typename T> template <typename T>
bool has_claim_with_value(const enum registered_claims cname, T&& value) const bool has_claim_with_value(const SCOPED_ENUM registered_claims cname, T&& value) const
{ {
return has_claim_with_value(reg_claims_to_str(cname), std::forward<T>(value)); return has_claim_with_value(reg_claims_to_str(cname), std::forward<T>(value));
} }
@ -1014,7 +1015,7 @@ public: // Exposed APIs
* @note: See `jwt_payload::add_claim` for more details. * @note: See `jwt_payload::add_claim` for more details.
*/ */
template <typename T> template <typename T>
jwt_object& add_claim(enum registered_claims cname, T&& value) jwt_object& add_claim(SCOPED_ENUM registered_claims cname, T&& value)
{ {
return add_claim(reg_claims_to_str(cname), std::forward<T>(value)); return add_claim(reg_claims_to_str(cname), std::forward<T>(value));
} }
@ -1031,7 +1032,7 @@ public: // Exposed APIs
* *
* @note: See `jwt_payload::remove_claim` for more details. * @note: See `jwt_payload::remove_claim` for more details.
*/ */
jwt_object& remove_claim(enum registered_claims cname) jwt_object& remove_claim(SCOPED_ENUM registered_claims cname)
{ {
return remove_claim(reg_claims_to_str(cname)); return remove_claim(reg_claims_to_str(cname));
} }
@ -1053,7 +1054,7 @@ public: // Exposed APIs
* *
* @note: See `jwt_payload::has_claim` for more details. * @note: See `jwt_payload::has_claim` for more details.
*/ */
bool has_claim(enum registered_claims cname) const noexcept bool has_claim(SCOPED_ENUM registered_claims cname) const noexcept
{ {
return payload().has_claim(cname); return payload().has_claim(cname);
} }