1. C++ / Говнокод #11578

    +18

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    template <typename TYPE> class Ptr
    {
    public:
        Ptr():
            Pointer_(0),
            IsValid_(false)
        {
        }
        Ptr( const Ptr<TYPE> &other )
        {
            this->Pointer_ = other.Pointer_;
            this->IsValid_ = other.IsValid_;
        }
        Ptr( TYPE* &ptr ):
            IsValid_(true)
        {
            if ( std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), ptr ) == Ptr<TYPE>::List_.end() )
                Ptr<TYPE>::List_.push_back( ptr );
            this->Pointer_ = ptr;
        }
        ~Ptr()
        {
        }
    
        inline Ptr<TYPE>& operator = ( const Ptr<TYPE> &other )
        {
            this->Pointer_ = other.Pointer_;
            this->IsValid_ = other.IsValid_;
    
            return *this;
        }
    
        inline Ptr<TYPE>& operator = ( TYPE* &ptr )
        {
            if ( std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), ptr ) == Ptr<TYPE>::List_.end() )
                Ptr<TYPE>::List_.push_back( ptr );
    
            this->Pointer_ = ptr;
            this->IsValid_ = true;
    
            return *this;
        }
    
        inline bool operator == ( const Ptr<TYPE> &other )
        {
            return (this->Pointer_ == other.Pointer_) ? true:false;
        }
    
        inline bool operator != ( const Ptr<TYPE> &other )
        {
            return (this->Pointer_ != other.Pointer_) ? true:false;
        }
    
        inline TYPE* operator -> ()
        {
            return this->Pointer_;
        }
    
        inline bool isValid() const
        {
            if (!this->IsValid_)
                return false;
            return this->IsValid_ = ( (std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), this->Pointer_ ) == Ptr<TYPE>::List_.end() ) ? false:true );
        }
    
        inline void release()
        {
            if ( this->isValid() )
            {
                Ptr<TYPE>::List_.erase( std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), this->Pointer_ ) );
                delete this->Pointer_;
            }
    
            this->Pointer_ = 0;
            this->IsValid_ = false;
        }
    
        inline TYPE* get()
        {
            return this->Pointer_;
        }
    private:
        TYPE* Pointer_;
        mutable bool IsValid_;
    
        static std::list < TYPE* > List_;
    };
    
    template <typename TYPE> std::list < TYPE* > Ptr<TYPE>::List_;

    Запостил: HaskellGovno, 12 Августа 2012

    Комментарии (34) RSS

    • Я наконец нашел правила, на которые ссылались эти сранные модераторы:
      http://govnokod.ru/page/license
      Ответить
    • Вместо std::list стоит воспользоваться std::set, т.к. здесь как раз используется семантика множества - "вставить если нет", "проверить, есть ли".

      Если вызвать release() на указателе, на который ссылались несколько Ptr'ов, и затем на другом из них вызвать get или operator -> (не вызвав предварительно isValid()), то получим прекрасный краш.

      Операторы == и != не смотрят на валидность.

      P.S. Это была попытка реализовать weak pointer?
      P.P.S. Проверку-на-отсутствие-и-вставку можно вынести в функцию, хотя при переходе на set'ы это не нужно.
      Ответить
      • Ну и да, в строках 46 и 51 унылый бульшит ;(
        Ответить
        • Я бы 0вой указатель взял бы за не валидный и выкинул IsValid_
          Ответить
      • Это ты суда скажи:
        http://www.gamedev.ru/flame/forum/?id=165503&page=9

        Там столько говнокодеров... Так что ты там очень нужен. Иначе наш русский гейдев так и останется на низком уровне. Мне даже за державу обидно...
        Ответить
        • > Ptr( TYPE* &ptr ) - и зачем тут ссылка?
          чтобы 0 не передали в конструктор.


          Наивный...
          Ответить
        • Я не пойду туда, т.к. они обидятся на то, что я буду называть вещи своими именами (90% их кода говном), и забанят меня.
          Ответить
          • А теперь представь себе, что ты наехал у нас на говнокодике на код модератора и он тоже обидется?
            Ответить
            • Если модератор выложит код под своей учеткой - то никто не будет наезжать на него.
              Если же он выложит его под чужой учеткой - то мы обвиним его в мультводстве, и он, согласно правилам должен будеть самозабаниться.
              Ответить
      • Вроде последняя серьёзная русская игра, за которую не обидно - сталкер. О остальных даже не слышно.
        Ответить
        • А я думал - королевское баунKing's Bounty.
          Ответить
        • Так ведь она не русская.
          Ответить
          • из педивикии:
            S.T.A.L.K.E.R. — бренд, принадлежащий украинской компании «GSC Game World»
            Ответить
          • Блин, вот думаешь русский гейдев пошел в гору. Ан нет. И тут облом.
            Ответить
            • утешьтесь, сэр! есть же http://ru.wikipedia.org/wiki/Магия_крови
              Ответить
              • Вы меня обнадежили. Я больше не беспокоюсь за ГейДев.
                Ответить
              • Так 1С помимо локализаций (в т.ч. русификации Бейсика, которой посвящен раздел этого сайта) делает еще и игры:
                Серия Ил-2. и Сцанитары подземелий от Главного сантехника страны. (там есть еще и другие петросянские поделки из говна по следам "смищных переводов", но я не помню названий).
                Ответить
            • "Ядерный титбит"?
              Ответить
            • Ещё, кажется постал третий делали русские утырки под крылом акеллы. Вот это всем трешам треш!
              Ответить
      • Я бы взял std::unordered_set
        Этот птр не может в многопоточность
        release бы заменил на RAII (red alert II)

        На самом бы деле я бы выкинул это говно и взял бы std::shared_ptr и std::weak_ptr
        .
        Ответить
        • > Я бы взял std::unordered_set
          C++11?

          > Этот птр не может в многопоточность
          Согласен.

          > release бы заменил на RAII (red alert II)
          Тогда,наверное, придется переименовать ЭТО в WeakPtr и запилить Ptr, с RAII и подсчетом ссылок...

          > На самом бы деле я бы выкинул это говно и взял бы std::shared_ptr и std::weak_ptr.
          Глаголите истину.
          Ответить
          • Как вы цитируете вместе с тегами?
            Ответить
            • Хм. Жму кнопочку "цитировать с тегами". Страйко вчера заимплементил эту фичу.
              Ответить
      • http://en.cppreference.com/w/cpp/container/set

        >std::set meets the requirements of Container, AllocatorAwareContainer, AssociativeContainer and ReversibleContainer.
        >C++ concepts: Container
        WTF? Неужели прошел слух, что концепты добавят в следующем стандарте? Почему эти строчки вдруг добавили в основную вики по STL?
        Ответить
        • Может я попал в другое измерение в котором концепты в С++ всеже добавили? о_О
          Ура! ^_^
          Ухожу в гугл...
          Ответить
        • Here concepts have little in common with the abovementioned proposal. They refer to informal named requirements, used in C++03 and C++11 to define behavior and expected properties for various types.
          Ответить
          • Кстати, вот в С++11 появился
            emplace_hint
            >Inserts a new element to the container, using hint as a suggestion where the element should go
            >should
            Я правильно понимаю, если я указал не верный hint, то STL его проигнорирует?
            У insert тоже появились хинты.
            Ответить

    Добавить комментарий