On 01.01.2019 02:08, James McCoy wrote:
> On Mon, Dec 31, 2018 at 12:07:23AM +0100, Branko Čibej wrote:
>> Summary: I propose to create one or possibly several new public header
>> files that will be used by both the C and C++ public APIs.
>>
>>
>> I would like to completely hide the dependency on APR from the public
>> parts of the C++ API. In order to do that, public C++ headers must not
>> include the C headers directly, because most if not all of them do
>> expose APR.
>>
>> Up to now I've been "solving" this in an unsatisfactory and error-prone
>> way, redefining enumeration values in C++ to be the same as in C,
>> forward-declaring C structures in C++ headers, and so on. Instead, I'd
>> like to extract certain parts of the C public API into a new header that
>> is independent of APR, and use that in both APIs. This way I won't avoid
>> redefining enumerations, for example, but I can ensure that both the C
>> and C++ APIs use the same enumeration constant values.
>>
>> I'm attaching a patch that shows an example of what I have in mind.
>>
>> Please raise your objections by next year. :)
>>
>> -- Brane
>> Index: subversion/include/svn__impl__types.h
>> ===================================================================
>> --- subversion/include/svn__impl__types.h (nonexistent)
>> +++ subversion/include/svn__impl__types.h (working copy)
>> @@ -0,0 +1,95 @@
>> +/**
>> + * @copyright
>> + * ====================================================================
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements. See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership. The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License. You may obtain a copy of the License at
>> + *
>> + * http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied. See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + * ====================================================================
>> + * @endcopyright
>> + *
>> + * @file svn_types.h
>> + * @brief Types implementation.
>> + * This is a @b private implementation-specific header file.
>> + * User code should not include it directly.
>> + */
>> +
>> +#ifndef SVN_X_IMPL_X_TYPES_H
>> +#define SVN_X_IMPL_X_TYPES_H
>> +
>> +/*
>> + * Define Subversion types that do not depend on APR or other
>> + * external libraries (except for the C standard libvrary) and are
>> + * shared betwen the C and C++ APIs. Do not include any headers
>> + * except for the C standard library headers here.
>> + */
>> +
>> +#ifdef __cplusplus
>> +extern "C" {
>> +#endif /* __cplusplus */
>> +
>> +/* Tristate values
>> + * See: svn_tristate_t in svn_types.h
>> + * tristate in svnxx/tristate.hpp
>> + */
>> +enum svn__impl__tristate_t
> In C++, identifiers with a double underscore _anywhere_ are reserved.
> Although it's unlikely that these names will end up being used by a
> compiler implementation somewhere, we probably shouldn't be using them.
True, I'd forgotten about that. I'm too used to breaking that rule in
SVN's private/public APIs. :)
-- Brane
Received on 2019-01-02 19:48:43 CET