- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 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.08.2012 20:18 # +7
HaskellGovno 12.08.2012 20:19 # +4
HaskellGovno 12.08.2012 20:27 # +4
bormand 12.08.2012 20:28 # +1
Если вызвать release() на указателе, на который ссылались несколько Ptr'ов, и затем на другом из них вызвать get или operator -> (не вызвав предварительно isValid()), то получим прекрасный краш.
Операторы == и != не смотрят на валидность.
P.S. Это была попытка реализовать weak pointer?
P.P.S. Проверку-на-отсутствие-и-вставку можно вынести в функцию, хотя при переходе на set'ы это не нужно.
bormand 12.08.2012 20:33 # +2
HaskellGovno 12.08.2012 20:51 # +1
HaskellGovno 12.08.2012 20:34 # +1
Там столько говнокодеров... Так что ты там очень нужен. Иначе наш русский гейдев так и останется на низком уровне. Мне даже за державу обидно...
bormand 12.08.2012 20:39 # +2
чтобы 0 не передали в конструктор.
Наивный...
bormand 12.08.2012 21:01 # +4
HaskellGovno 12.08.2012 21:03 # +1
bormand 12.08.2012 21:07 # +4
Если же он выложит его под чужой учеткой - то мы обвиним его в мультводстве, и он, согласно правилам должен будеть самозабаниться.
PythonGovno 12.08.2012 21:10 # −4
HaskellGovno 12.08.2012 21:14 # +3
GravatarGovno 21.07.2021 00:13 # 0
vistefan 12.08.2012 21:21 # +3
HaskellGovno 12.08.2012 20:34 # +1
eth0 13.08.2012 06:25 # +3
zim 13.08.2012 10:16 # +2
Lure Of Chaos 13.08.2012 22:58 # +1
S.T.A.L.K.E.R. — бренд, принадлежащий украинской компании «GSC Game World»
HaskellGovno 13.08.2012 23:04 # +2
Lure Of Chaos 13.08.2012 23:07 # +2
HaskellGovno 13.08.2012 23:10 # +2
suc-daniil 14.08.2012 16:09 # +1
3.14159265 17.08.2012 15:45 # +1
Серия Ил-2. и Сцанитары подземелий от Главного сантехника страны. (там есть еще и другие петросянские поделки из говна по следам "смищных переводов", но я не помню названий).
psycho-coder 17.08.2012 14:40 # +1
eth0 17.08.2012 16:58 # +1
HaskellGovno 12.08.2012 20:38 # +2
Этот птр не может в многопоточность
release бы заменил на RAII (red alert II)
На самом бы деле я бы выкинул это говно и взял бы std::shared_ptr и std::weak_ptr.
bormand 12.08.2012 20:46 # +2
C++11?
> Этот птр не может в многопоточность
Согласен.
> release бы заменил на RAII (red alert II)
Тогда,наверное, придется переименовать ЭТО в WeakPtr и запилить Ptr, с RAII и подсчетом ссылок...
> На самом бы деле я бы выкинул это говно и взял бы std::shared_ptr и std::weak_ptr.
Глаголите истину.
HaskellGovno 12.08.2012 20:50 # +2
bormand 12.08.2012 20:57 # +3
HaskellGovno 12.08.2012 20:44 # 0
>std::set meets the requirements of Container, AllocatorAwareContainer, AssociativeContainer and ReversibleContainer.
>C++ concepts: Container
WTF? Неужели прошел слух, что концепты добавят в следующем стандарте? Почему эти строчки вдруг добавили в основную вики по STL?
HaskellGovno 12.08.2012 20:47 # 0
Ура! ^_^
Ухожу в гугл...
bormand 12.08.2012 20:54 # +1
HaskellGovno 12.08.2012 21:10 # 0
emplace_hint
>Inserts a new element to the container, using hint as a suggestion where the element should go
>should
Я правильно понимаю, если я указал не верный hint, то STL его проигнорирует?
У insert тоже появились хинты.