11debfc3dSmrg // Default predicates for internal use -*- C++ -*- 21debfc3dSmrg 3*8feb0f0bSmrg // Copyright (C) 2013-2020 Free Software Foundation, Inc. 41debfc3dSmrg // 51debfc3dSmrg // This file is part of the GNU ISO C++ Library. This library is free 61debfc3dSmrg // software; you can redistribute it and/or modify it under the 71debfc3dSmrg // terms of the GNU General Public License as published by the 81debfc3dSmrg // Free Software Foundation; either version 3, or (at your option) 91debfc3dSmrg // any later version. 101debfc3dSmrg 111debfc3dSmrg // This library is distributed in the hope that it will be useful, 121debfc3dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 131debfc3dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141debfc3dSmrg // GNU General Public License for more details. 151debfc3dSmrg 161debfc3dSmrg // Under Section 7 of GPL version 3, you are granted additional 171debfc3dSmrg // permissions described in the GCC Runtime Library Exception, version 181debfc3dSmrg // 3.1, as published by the Free Software Foundation. 191debfc3dSmrg 201debfc3dSmrg // You should have received a copy of the GNU General Public License and 211debfc3dSmrg // a copy of the GCC Runtime Library Exception along with this program; 221debfc3dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 231debfc3dSmrg // <http://www.gnu.org/licenses/>. 241debfc3dSmrg 251debfc3dSmrg /** @file predefined_ops.h 261debfc3dSmrg * This is an internal header file, included by other library headers. 271debfc3dSmrg * You should not attempt to use it directly. @headername{algorithm} 281debfc3dSmrg */ 291debfc3dSmrg 301debfc3dSmrg #ifndef _GLIBCXX_PREDEFINED_OPS_H 311debfc3dSmrg #define _GLIBCXX_PREDEFINED_OPS_H 1 321debfc3dSmrg 331debfc3dSmrg namespace __gnu_cxx 341debfc3dSmrg { 351debfc3dSmrg namespace __ops 361debfc3dSmrg { 371debfc3dSmrg struct _Iter_less_iter 381debfc3dSmrg { 391debfc3dSmrg template<typename _Iterator1, typename _Iterator2> 401debfc3dSmrg _GLIBCXX14_CONSTEXPR 411debfc3dSmrg bool operator_Iter_less_iter421debfc3dSmrg operator()(_Iterator1 __it1, _Iterator2 __it2) const 431debfc3dSmrg { return *__it1 < *__it2; } 441debfc3dSmrg }; 451debfc3dSmrg 461debfc3dSmrg _GLIBCXX14_CONSTEXPR 471debfc3dSmrg inline _Iter_less_iter __iter_less_iter()481debfc3dSmrg __iter_less_iter() 491debfc3dSmrg { return _Iter_less_iter(); } 501debfc3dSmrg 511debfc3dSmrg struct _Iter_less_val 521debfc3dSmrg { 531debfc3dSmrg #if __cplusplus >= 201103L 541debfc3dSmrg constexpr _Iter_less_val() = default; 551debfc3dSmrg #else 561debfc3dSmrg _Iter_less_val() { } 571debfc3dSmrg #endif 581debfc3dSmrg 59*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 601debfc3dSmrg explicit _Iter_less_val_Iter_less_val611debfc3dSmrg _Iter_less_val(_Iter_less_iter) { } 621debfc3dSmrg 631debfc3dSmrg template<typename _Iterator, typename _Value> 64*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 651debfc3dSmrg bool operator_Iter_less_val661debfc3dSmrg operator()(_Iterator __it, _Value& __val) const 671debfc3dSmrg { return *__it < __val; } 681debfc3dSmrg }; 691debfc3dSmrg 70*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 711debfc3dSmrg inline _Iter_less_val __iter_less_val()721debfc3dSmrg __iter_less_val() 731debfc3dSmrg { return _Iter_less_val(); } 741debfc3dSmrg 75*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 761debfc3dSmrg inline _Iter_less_val __iter_comp_val(_Iter_less_iter)771debfc3dSmrg __iter_comp_val(_Iter_less_iter) 781debfc3dSmrg { return _Iter_less_val(); } 791debfc3dSmrg 801debfc3dSmrg struct _Val_less_iter 811debfc3dSmrg { 821debfc3dSmrg #if __cplusplus >= 201103L 831debfc3dSmrg constexpr _Val_less_iter() = default; 841debfc3dSmrg #else 851debfc3dSmrg _Val_less_iter() { } 861debfc3dSmrg #endif 871debfc3dSmrg 88*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 891debfc3dSmrg explicit _Val_less_iter_Val_less_iter901debfc3dSmrg _Val_less_iter(_Iter_less_iter) { } 911debfc3dSmrg 921debfc3dSmrg template<typename _Value, typename _Iterator> 93*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 941debfc3dSmrg bool operator_Val_less_iter951debfc3dSmrg operator()(_Value& __val, _Iterator __it) const 961debfc3dSmrg { return __val < *__it; } 971debfc3dSmrg }; 981debfc3dSmrg 99*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1001debfc3dSmrg inline _Val_less_iter __val_less_iter()1011debfc3dSmrg __val_less_iter() 1021debfc3dSmrg { return _Val_less_iter(); } 1031debfc3dSmrg 104*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1051debfc3dSmrg inline _Val_less_iter __val_comp_iter(_Iter_less_iter)1061debfc3dSmrg __val_comp_iter(_Iter_less_iter) 1071debfc3dSmrg { return _Val_less_iter(); } 1081debfc3dSmrg 1091debfc3dSmrg struct _Iter_equal_to_iter 1101debfc3dSmrg { 1111debfc3dSmrg template<typename _Iterator1, typename _Iterator2> 112*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1131debfc3dSmrg bool operator_Iter_equal_to_iter1141debfc3dSmrg operator()(_Iterator1 __it1, _Iterator2 __it2) const 1151debfc3dSmrg { return *__it1 == *__it2; } 1161debfc3dSmrg }; 1171debfc3dSmrg 118*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1191debfc3dSmrg inline _Iter_equal_to_iter __iter_equal_to_iter()1201debfc3dSmrg __iter_equal_to_iter() 1211debfc3dSmrg { return _Iter_equal_to_iter(); } 1221debfc3dSmrg 1231debfc3dSmrg struct _Iter_equal_to_val 1241debfc3dSmrg { 1251debfc3dSmrg template<typename _Iterator, typename _Value> 126*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1271debfc3dSmrg bool operator_Iter_equal_to_val1281debfc3dSmrg operator()(_Iterator __it, _Value& __val) const 1291debfc3dSmrg { return *__it == __val; } 1301debfc3dSmrg }; 1311debfc3dSmrg 132*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1331debfc3dSmrg inline _Iter_equal_to_val __iter_equal_to_val()1341debfc3dSmrg __iter_equal_to_val() 1351debfc3dSmrg { return _Iter_equal_to_val(); } 1361debfc3dSmrg 137*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1381debfc3dSmrg inline _Iter_equal_to_val __iter_comp_val(_Iter_equal_to_iter)1391debfc3dSmrg __iter_comp_val(_Iter_equal_to_iter) 1401debfc3dSmrg { return _Iter_equal_to_val(); } 1411debfc3dSmrg 1421debfc3dSmrg template<typename _Compare> 1431debfc3dSmrg struct _Iter_comp_iter 1441debfc3dSmrg { 1451debfc3dSmrg _Compare _M_comp; 1461debfc3dSmrg 1471debfc3dSmrg explicit _GLIBCXX14_CONSTEXPR _Iter_comp_iter_Iter_comp_iter1481debfc3dSmrg _Iter_comp_iter(_Compare __comp) 1491debfc3dSmrg : _M_comp(_GLIBCXX_MOVE(__comp)) 1501debfc3dSmrg { } 1511debfc3dSmrg 1521debfc3dSmrg template<typename _Iterator1, typename _Iterator2> 1531debfc3dSmrg _GLIBCXX14_CONSTEXPR 1541debfc3dSmrg bool operator_Iter_comp_iter1551debfc3dSmrg operator()(_Iterator1 __it1, _Iterator2 __it2) 1561debfc3dSmrg { return bool(_M_comp(*__it1, *__it2)); } 1571debfc3dSmrg }; 1581debfc3dSmrg 1591debfc3dSmrg template<typename _Compare> 1601debfc3dSmrg _GLIBCXX14_CONSTEXPR 1611debfc3dSmrg inline _Iter_comp_iter<_Compare> __iter_comp_iter(_Compare __comp)1621debfc3dSmrg __iter_comp_iter(_Compare __comp) 1631debfc3dSmrg { return _Iter_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); } 1641debfc3dSmrg 1651debfc3dSmrg template<typename _Compare> 1661debfc3dSmrg struct _Iter_comp_val 1671debfc3dSmrg { 1681debfc3dSmrg _Compare _M_comp; 1691debfc3dSmrg 170*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1711debfc3dSmrg explicit _Iter_comp_val_Iter_comp_val1721debfc3dSmrg _Iter_comp_val(_Compare __comp) 1731debfc3dSmrg : _M_comp(_GLIBCXX_MOVE(__comp)) 1741debfc3dSmrg { } 1751debfc3dSmrg 176*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1771debfc3dSmrg explicit _Iter_comp_val_Iter_comp_val1781debfc3dSmrg _Iter_comp_val(const _Iter_comp_iter<_Compare>& __comp) 1791debfc3dSmrg : _M_comp(__comp._M_comp) 1801debfc3dSmrg { } 1811debfc3dSmrg 1821debfc3dSmrg #if __cplusplus >= 201103L 183*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1841debfc3dSmrg explicit _Iter_comp_val_Iter_comp_val1851debfc3dSmrg _Iter_comp_val(_Iter_comp_iter<_Compare>&& __comp) 1861debfc3dSmrg : _M_comp(std::move(__comp._M_comp)) 1871debfc3dSmrg { } 1881debfc3dSmrg #endif 1891debfc3dSmrg 1901debfc3dSmrg template<typename _Iterator, typename _Value> 191*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1921debfc3dSmrg bool operator_Iter_comp_val1931debfc3dSmrg operator()(_Iterator __it, _Value& __val) 1941debfc3dSmrg { return bool(_M_comp(*__it, __val)); } 1951debfc3dSmrg }; 1961debfc3dSmrg 1971debfc3dSmrg template<typename _Compare> 198*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 1991debfc3dSmrg inline _Iter_comp_val<_Compare> __iter_comp_val(_Compare __comp)2001debfc3dSmrg __iter_comp_val(_Compare __comp) 2011debfc3dSmrg { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); } 2021debfc3dSmrg 2031debfc3dSmrg template<typename _Compare> 204*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2051debfc3dSmrg inline _Iter_comp_val<_Compare> __iter_comp_val(_Iter_comp_iter<_Compare> __comp)2061debfc3dSmrg __iter_comp_val(_Iter_comp_iter<_Compare> __comp) 2071debfc3dSmrg { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); } 2081debfc3dSmrg 2091debfc3dSmrg template<typename _Compare> 2101debfc3dSmrg struct _Val_comp_iter 2111debfc3dSmrg { 2121debfc3dSmrg _Compare _M_comp; 2131debfc3dSmrg 214*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2151debfc3dSmrg explicit _Val_comp_iter_Val_comp_iter2161debfc3dSmrg _Val_comp_iter(_Compare __comp) 2171debfc3dSmrg : _M_comp(_GLIBCXX_MOVE(__comp)) 2181debfc3dSmrg { } 2191debfc3dSmrg 220*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2211debfc3dSmrg explicit _Val_comp_iter_Val_comp_iter2221debfc3dSmrg _Val_comp_iter(const _Iter_comp_iter<_Compare>& __comp) 2231debfc3dSmrg : _M_comp(__comp._M_comp) 2241debfc3dSmrg { } 2251debfc3dSmrg 2261debfc3dSmrg #if __cplusplus >= 201103L 227*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2281debfc3dSmrg explicit _Val_comp_iter_Val_comp_iter2291debfc3dSmrg _Val_comp_iter(_Iter_comp_iter<_Compare>&& __comp) 2301debfc3dSmrg : _M_comp(std::move(__comp._M_comp)) 2311debfc3dSmrg { } 2321debfc3dSmrg #endif 2331debfc3dSmrg 2341debfc3dSmrg template<typename _Value, typename _Iterator> 235*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2361debfc3dSmrg bool operator_Val_comp_iter2371debfc3dSmrg operator()(_Value& __val, _Iterator __it) 2381debfc3dSmrg { return bool(_M_comp(__val, *__it)); } 2391debfc3dSmrg }; 2401debfc3dSmrg 2411debfc3dSmrg template<typename _Compare> 242*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2431debfc3dSmrg inline _Val_comp_iter<_Compare> __val_comp_iter(_Compare __comp)2441debfc3dSmrg __val_comp_iter(_Compare __comp) 2451debfc3dSmrg { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); } 2461debfc3dSmrg 2471debfc3dSmrg template<typename _Compare> 248*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2491debfc3dSmrg inline _Val_comp_iter<_Compare> __val_comp_iter(_Iter_comp_iter<_Compare> __comp)2501debfc3dSmrg __val_comp_iter(_Iter_comp_iter<_Compare> __comp) 2511debfc3dSmrg { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); } 2521debfc3dSmrg 2531debfc3dSmrg template<typename _Value> 2541debfc3dSmrg struct _Iter_equals_val 2551debfc3dSmrg { 2561debfc3dSmrg _Value& _M_value; 2571debfc3dSmrg 258*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2591debfc3dSmrg explicit _Iter_equals_val_Iter_equals_val2601debfc3dSmrg _Iter_equals_val(_Value& __value) 2611debfc3dSmrg : _M_value(__value) 2621debfc3dSmrg { } 2631debfc3dSmrg 2641debfc3dSmrg template<typename _Iterator> 265*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2661debfc3dSmrg bool operator_Iter_equals_val2671debfc3dSmrg operator()(_Iterator __it) 2681debfc3dSmrg { return *__it == _M_value; } 2691debfc3dSmrg }; 2701debfc3dSmrg 2711debfc3dSmrg template<typename _Value> 272*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2731debfc3dSmrg inline _Iter_equals_val<_Value> __iter_equals_val(_Value & __val)2741debfc3dSmrg __iter_equals_val(_Value& __val) 2751debfc3dSmrg { return _Iter_equals_val<_Value>(__val); } 2761debfc3dSmrg 2771debfc3dSmrg template<typename _Iterator1> 2781debfc3dSmrg struct _Iter_equals_iter 2791debfc3dSmrg { 2801debfc3dSmrg _Iterator1 _M_it1; 2811debfc3dSmrg 282*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2831debfc3dSmrg explicit _Iter_equals_iter_Iter_equals_iter2841debfc3dSmrg _Iter_equals_iter(_Iterator1 __it1) 2851debfc3dSmrg : _M_it1(__it1) 2861debfc3dSmrg { } 2871debfc3dSmrg 2881debfc3dSmrg template<typename _Iterator2> 289*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2901debfc3dSmrg bool operator_Iter_equals_iter2911debfc3dSmrg operator()(_Iterator2 __it2) 2921debfc3dSmrg { return *__it2 == *_M_it1; } 2931debfc3dSmrg }; 2941debfc3dSmrg 2951debfc3dSmrg template<typename _Iterator> 296*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 2971debfc3dSmrg inline _Iter_equals_iter<_Iterator> __iter_comp_iter(_Iter_equal_to_iter,_Iterator __it)2981debfc3dSmrg __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it) 2991debfc3dSmrg { return _Iter_equals_iter<_Iterator>(__it); } 3001debfc3dSmrg 3011debfc3dSmrg template<typename _Predicate> 3021debfc3dSmrg struct _Iter_pred 3031debfc3dSmrg { 3041debfc3dSmrg _Predicate _M_pred; 3051debfc3dSmrg 306*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3071debfc3dSmrg explicit _Iter_pred_Iter_pred3081debfc3dSmrg _Iter_pred(_Predicate __pred) 3091debfc3dSmrg : _M_pred(_GLIBCXX_MOVE(__pred)) 3101debfc3dSmrg { } 3111debfc3dSmrg 3121debfc3dSmrg template<typename _Iterator> 313*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3141debfc3dSmrg bool operator_Iter_pred3151debfc3dSmrg operator()(_Iterator __it) 3161debfc3dSmrg { return bool(_M_pred(*__it)); } 3171debfc3dSmrg }; 3181debfc3dSmrg 3191debfc3dSmrg template<typename _Predicate> 320*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3211debfc3dSmrg inline _Iter_pred<_Predicate> __pred_iter(_Predicate __pred)3221debfc3dSmrg __pred_iter(_Predicate __pred) 3231debfc3dSmrg { return _Iter_pred<_Predicate>(_GLIBCXX_MOVE(__pred)); } 3241debfc3dSmrg 3251debfc3dSmrg template<typename _Compare, typename _Value> 3261debfc3dSmrg struct _Iter_comp_to_val 3271debfc3dSmrg { 3281debfc3dSmrg _Compare _M_comp; 3291debfc3dSmrg _Value& _M_value; 3301debfc3dSmrg 331*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR _Iter_comp_to_val_Iter_comp_to_val3321debfc3dSmrg _Iter_comp_to_val(_Compare __comp, _Value& __value) 3331debfc3dSmrg : _M_comp(_GLIBCXX_MOVE(__comp)), _M_value(__value) 3341debfc3dSmrg { } 3351debfc3dSmrg 3361debfc3dSmrg template<typename _Iterator> 337*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3381debfc3dSmrg bool operator_Iter_comp_to_val3391debfc3dSmrg operator()(_Iterator __it) 3401debfc3dSmrg { return bool(_M_comp(*__it, _M_value)); } 3411debfc3dSmrg }; 3421debfc3dSmrg 3431debfc3dSmrg template<typename _Compare, typename _Value> 3441debfc3dSmrg _Iter_comp_to_val<_Compare, _Value> 345*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR __iter_comp_val(_Compare __comp,_Value & __val)3461debfc3dSmrg __iter_comp_val(_Compare __comp, _Value &__val) 3471debfc3dSmrg { 3481debfc3dSmrg return _Iter_comp_to_val<_Compare, _Value>(_GLIBCXX_MOVE(__comp), __val); 3491debfc3dSmrg } 3501debfc3dSmrg 3511debfc3dSmrg template<typename _Compare, typename _Iterator1> 3521debfc3dSmrg struct _Iter_comp_to_iter 3531debfc3dSmrg { 3541debfc3dSmrg _Compare _M_comp; 3551debfc3dSmrg _Iterator1 _M_it1; 3561debfc3dSmrg 357*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR _Iter_comp_to_iter_Iter_comp_to_iter3581debfc3dSmrg _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1) 3591debfc3dSmrg : _M_comp(_GLIBCXX_MOVE(__comp)), _M_it1(__it1) 3601debfc3dSmrg { } 3611debfc3dSmrg 3621debfc3dSmrg template<typename _Iterator2> 363*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3641debfc3dSmrg bool operator_Iter_comp_to_iter3651debfc3dSmrg operator()(_Iterator2 __it2) 3661debfc3dSmrg { return bool(_M_comp(*__it2, *_M_it1)); } 3671debfc3dSmrg }; 3681debfc3dSmrg 3691debfc3dSmrg template<typename _Compare, typename _Iterator> 370*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3711debfc3dSmrg inline _Iter_comp_to_iter<_Compare, _Iterator> __iter_comp_iter(_Iter_comp_iter<_Compare> __comp,_Iterator __it)3721debfc3dSmrg __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it) 3731debfc3dSmrg { 3741debfc3dSmrg return _Iter_comp_to_iter<_Compare, _Iterator>( 3751debfc3dSmrg _GLIBCXX_MOVE(__comp._M_comp), __it); 3761debfc3dSmrg } 3771debfc3dSmrg 3781debfc3dSmrg template<typename _Predicate> 3791debfc3dSmrg struct _Iter_negate 3801debfc3dSmrg { 3811debfc3dSmrg _Predicate _M_pred; 3821debfc3dSmrg 383*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3841debfc3dSmrg explicit _Iter_negate_Iter_negate3851debfc3dSmrg _Iter_negate(_Predicate __pred) 3861debfc3dSmrg : _M_pred(_GLIBCXX_MOVE(__pred)) 3871debfc3dSmrg { } 3881debfc3dSmrg 3891debfc3dSmrg template<typename _Iterator> 390*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3911debfc3dSmrg bool operator_Iter_negate3921debfc3dSmrg operator()(_Iterator __it) 3931debfc3dSmrg { return !bool(_M_pred(*__it)); } 3941debfc3dSmrg }; 3951debfc3dSmrg 3961debfc3dSmrg template<typename _Predicate> 397*8feb0f0bSmrg _GLIBCXX20_CONSTEXPR 3981debfc3dSmrg inline _Iter_negate<_Predicate> __negate(_Iter_pred<_Predicate> __pred)3991debfc3dSmrg __negate(_Iter_pred<_Predicate> __pred) 4001debfc3dSmrg { return _Iter_negate<_Predicate>(_GLIBCXX_MOVE(__pred._M_pred)); } 4011debfc3dSmrg 4021debfc3dSmrg } // namespace __ops 4031debfc3dSmrg } // namespace __gnu_cxx 4041debfc3dSmrg 4051debfc3dSmrg #endif 406