1 /** 2 * @copyright 3 * ==================================================================== 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 * ==================================================================== 21 * @endcopyright 22 */ 23 24 #ifndef SVNXX_PRIVATE_REVISION_HPP 25 #define SVNXX_PRIVATE_REVISION_HPP 26 27 #include <stdexcept> 28 29 #include "svnxx/revision.hpp" 30 31 #include "svn_opt.h" 32 33 namespace apache { 34 namespace subversion { 35 namespace svnxx { 36 namespace impl { 37 38 /** 39 * Convert @a kind to an svn_opt_revision_kind. 40 */ convert(revision::kind kind)41inline constexpr svn_opt_revision_kind convert(revision::kind kind) 42 { 43 #ifndef SVN_DEBUG 44 return svn_opt_revision_kind(kind); 45 #else 46 // switch in constexpr is allowed in C++14 but not in C++11, 47 // so we have to use a series of ternary operators. 48 return (kind == revision::kind::unspecified 49 ? (svn_opt_revision_kind(kind) != svn_opt_revision_unspecified 50 ? throw std::range_error("convert(svn::revision::kind::unspecified)") 51 : svn_opt_revision_kind(kind)) 52 : 53 kind == revision::kind::number 54 ? (svn_opt_revision_kind(kind) != svn_opt_revision_number 55 ? throw std::range_error("convert(svn::revision::kind::number)") 56 : svn_opt_revision_kind(kind)) 57 : 58 kind == revision::kind::date 59 ? (svn_opt_revision_kind(kind) != svn_opt_revision_date 60 ? throw std::range_error("convert(svn::revision::kind::date)") 61 : svn_opt_revision_kind(kind)) 62 : 63 kind == revision::kind::committed 64 ? (svn_opt_revision_kind(kind) != svn_opt_revision_committed 65 ? throw std::range_error("convert(svn::revision::kind::committed)") 66 : svn_opt_revision_kind(kind)) 67 : 68 kind == revision::kind::previous 69 ? (svn_opt_revision_kind(kind) != svn_opt_revision_previous 70 ? throw std::range_error("convert(svn::revision::kind::previous)") 71 : svn_opt_revision_kind(kind)) 72 : 73 kind == revision::kind::base 74 ? (svn_opt_revision_kind(kind) != svn_opt_revision_base 75 ? throw std::range_error("convert(svn::revision::kind::base)") 76 : svn_opt_revision_kind(kind)) 77 : 78 kind == revision::kind::working 79 ? (svn_opt_revision_kind(kind) != svn_opt_revision_working 80 ? throw std::range_error("convert(svn::revision::kind::working)") 81 : svn_opt_revision_kind(kind)) 82 : 83 kind == revision::kind::head 84 ? (svn_opt_revision_kind(kind) != svn_opt_revision_head 85 ? throw std::range_error("convert(svn::revision::kind::head)") 86 : svn_opt_revision_kind(kind)) 87 : 88 throw std::range_error("convert: unknown svn::revision::kind")); 89 #endif 90 } 91 92 /** 93 * Convert @a kind to an svn::revision::kind. 94 */ convert(svn_opt_revision_kind kind)95inline constexpr revision::kind convert(svn_opt_revision_kind kind) 96 { 97 #ifndef SVN_DEBUG 98 return revision::kind(kind); 99 #else 100 // switch in constexpr is allowed in C++14 but not in C++11, 101 // so we have to use a series of ternary operators. 102 return (kind ==svn_opt_revision_unspecified 103 ? (kind != svn_opt_revision_kind(revision::kind::unspecified) 104 ? throw std::range_error("convert(svn_opt_revision_unspecified)") 105 : revision::kind(kind)) 106 : 107 kind == svn_opt_revision_number 108 ? (kind != svn_opt_revision_kind(revision::kind::number) 109 ? throw std::range_error("convert(svn_opt_revision_number)") 110 : revision::kind(kind)) 111 : 112 kind == svn_opt_revision_date 113 ? (kind != svn_opt_revision_kind(revision::kind::date) 114 ? throw std::range_error("convert(svn_opt_revision_date)") 115 : revision::kind(kind)) 116 : 117 kind == svn_opt_revision_committed 118 ? (kind != svn_opt_revision_kind(revision::kind::committed) 119 ? throw std::range_error("convert(svn_opt_revision_committed)") 120 : revision::kind(kind)) 121 : 122 kind == svn_opt_revision_previous 123 ? (kind != svn_opt_revision_kind(revision::kind::previous) 124 ? throw std::range_error("convert(svn_opt_revision_previous)") 125 : revision::kind(kind)) 126 : 127 kind == svn_opt_revision_base 128 ? (kind != svn_opt_revision_kind(revision::kind::base) 129 ? throw std::range_error("convert(svn_opt_revision_base)") 130 : revision::kind(kind)) 131 : 132 kind == svn_opt_revision_working 133 ? (kind != svn_opt_revision_kind(revision::kind::working) 134 ? throw std::range_error("convert(svn_opt_revision_working)") 135 : revision::kind(kind)) 136 : 137 kind == svn_opt_revision_head 138 ? (kind != svn_opt_revision_kind(revision::kind::head) 139 ? throw std::range_error("convert(svn_opt_revision_head)") 140 : revision::kind(kind)) 141 : 142 throw std::range_error("convert: unknown svn_opt_revision_kind")); 143 #endif 144 } 145 146 /** 147 * Convert @a rev to an svn_opt_revision_t. 148 */ 149 svn_opt_revision_t convert(const revision& rev); 150 151 /** 152 * Convert @a rev to an svn::revision. 153 */ 154 revision convert(const svn_opt_revision_t& rev); 155 156 } // namespace impl 157 } // namespace svnxx 158 } // namespace subversion 159 } // namespace apache 160 161 #endif // SVNXX_PRIVATE_REVISION_HPP 162