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)41 inline 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)95 inline 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