Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add alias templates for core and util traits #1255

Merged
merged 1 commit into from
May 11, 2024

Conversation

awulkiew
Copy link
Member

@awulkiew awulkiew commented Mar 3, 2024

Plus:
Add C++17 variable templates for traits behind #ifdef
Use aliases in several algorithms

@@ -60,7 +61,7 @@ struct to_range_point
static inline void apply(Geometry& geometry, Point const& point,
signed_size_type = -1, signed_size_type = 0)
{
typename geometry::point_type<Geometry>::type copy;
geometry::point_type_t<Geometry> copy;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This first confused me.
Because, what about point_t ...

But it is correct.

From the standard:
using add_pointer_t = typename add_pointer<T>::type
using common_type_t = typename common_type<T...>::type

We have to confirm to the second form.

Copy link
Member Author

@awulkiew awulkiew Mar 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the standard pattern unfortunately is what it is and for someone familiar with it point_t would probably be confusing.

On similar note. I was thinking about adding aliases for Boost.Range traits like typename boost::range_value<Range>::type in util/range.hpp. C++20 adds this as std::ranges::range_value_t<>. In Boost.Geometry there is namespace bg::range already. This seems to be the best place for these aliases even though the word range is repeated. However I don't have a strong opinion about it, I see several possibilities:

  • boost::geometry::range::range_value_t<>
  • boost::geometry::range_value_t<>
  • boost::geometry::range::value_t<>
  • boost::geometry::ranges::range_value_t<> (probably the closest to the standard)

Do you have any opinions?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would adhere to the standard. So that's the last one (incl. namespace) or the first one (with our namespace).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also agree with the 1st or last.

@@ -90,7 +91,7 @@ namespace dispatch
template
<
typename Geometry,
typename Tag = typename tag_cast<typename tag<Geometry>::type, multi_tag>::type
typename Tag = tag_cast_t<tag_t<Geometry>, multi_tag>
Copy link
Collaborator

@barendgehrels barendgehrels Mar 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll finish my review later (probably tomorrow) but this all looks very good, cool improvement. Way more readable.

Thanks for all this work.



namespace util
{

template <typename T>
using bare_type = remove_cptrref<T>;
using bare_type [[deprecated]] = remove_cptrref<T>;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this needs a comment saying why this is deprecated, and what is the replacement.

Copy link
Collaborator

@barendgehrels barendgehrels Mar 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually I was not aware of cptrref and find it hardly readable.
bare_type is clearer.

But anyway, there is std::decay too, is it equivalent? Can't we deprecate both and use that instead (if it works)?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've used this name because in the standard there are:

remove_const<>
remove_volatile<>
remove_reference<>
remove_pointer<>

and then there are:

remove_cv<>
remove_cvref<>

The latter first removes reference and then const volatile. Because originally bare_type was first removing reference, then pointer, then cv (because there can be a reference to pointer) I named it:

remove_cptrref<>

If we wanted to remove volatile too which we probably should do I'd call it:

remove_cvptrref

but originally volatile was not removed so I didn't do it.

AFAIU std::decay wouldn't remove pointer.

struct add_const_if_c
{
typedef std::conditional_t
struct [[deprecated]] add_const_if_c
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also here, can you add a comment?

@@ -307,7 +364,8 @@ using enable_if_geometry_collection_t = typename enable_if_geometry_collection<G
\note Also a "ring" has areal properties within Boost.Geometry
\ingroup core
*/
using util::is_areal;
template <typename T>
using is_areal [[deprecated]] = util::is_areal<T>;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before you ask, I'll add an explanation here as well. :)

Copy link
Collaborator

@barendgehrels barendgehrels left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As said, all cool, thanks.
We should add it to the docs too.

Copy link
Member

@vissarion vissarion left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, looks nice.

@@ -60,7 +61,7 @@ struct to_range_point
static inline void apply(Geometry& geometry, Point const& point,
signed_size_type = -1, signed_size_type = 0)
{
typename geometry::point_type<Geometry>::type copy;
geometry::point_type_t<Geometry> copy;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also agree with the 1st or last.

Add C++17 variable templates for traits behind #ifdef

Use aliases in several algorithms
@awulkiew awulkiew force-pushed the feature/type_aliases branch from 5cfbfbc to 51cf51a Compare March 6, 2024 22:53
@awulkiew
Copy link
Member Author

Thanks for the reviews. Should I merge it now or wait until the release to make bugfixing easiter?

@vissarion
Copy link
Member

Thanks for the reviews. Should I merge it now or wait until the release to make bugfixing easiter?

I think it is simpler to merge it after the release.

@awulkiew awulkiew merged commit a7644cb into boostorg:develop May 11, 2024
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants