Skip to content

Commit

Permalink
M#3353 & few minor things
Browse files Browse the repository at this point in the history
  • Loading branch information
alabuzhev committed Dec 13, 2016
1 parent fc42fde commit 8fe72b3
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 24 deletions.
6 changes: 6 additions & 0 deletions far/changelog
@@ -1,3 +1,9 @@
drkns 14.12.2016 01:41:17 +0200 - build 4869

1. 0003353: Ошибка отрисовки при выходе машины из спячки.

2. Пара мелочей.

drkns 06.12.2016 09:32:48 +0200 - build 4868

1. Отменим пока 4866.1, т. к. стало хуже.
Expand Down
4 changes: 2 additions & 2 deletions far/common/conditional.hpp
Expand Up @@ -50,13 +50,13 @@ if (!Object)
bar();
*/

template<class T>
template<typename T>
class conditional
{
public:
explicit operator bool() const
{
return !static_cast<const T&>(*this).operator!();
return !!static_cast<const T&>(*this);
}

protected:
Expand Down
34 changes: 17 additions & 17 deletions far/common/smart_ptr.hpp
Expand Up @@ -32,22 +32,22 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

template<class T>
template<typename T>
class array_ptr: public conditional<array_ptr<T>>
{
public:
NONCOPYABLE(array_ptr);
TRIVIALLY_MOVABLE(array_ptr);

array_ptr() : m_size() {}
array_ptr() noexcept: m_size() {}
array_ptr(size_t size, bool init = false) { reset(size, init); }

void reset(size_t size, bool init = false) { m_array.reset(init? new T[size]() : new T[size]); m_size = size;}
void reset() { m_array.reset(); m_size = 0; }
void reset() noexcept { m_array.reset(); m_size = 0; }
size_t size() const noexcept { return m_size; }
bool operator!() const noexcept { return !m_array; }
T* get() const {return m_array.get();}
T& operator[](size_t n) const { assert(n < m_size); return m_array[n]; }
decltype(auto) get() const noexcept {return m_array.get();}
decltype(auto) operator[](size_t n) const { assert(n < m_size); return m_array[n]; }

private:
std::unique_ptr<T[]> m_array;
Expand All @@ -57,33 +57,33 @@ class array_ptr: public conditional<array_ptr<T>>
using wchar_t_ptr = array_ptr<wchar_t>;
using char_ptr = array_ptr<char>;

template<class T>
class block_ptr:public char_ptr
template<typename T>
class block_ptr: public char_ptr
{
public:
NONCOPYABLE(block_ptr);
TRIVIALLY_MOVABLE(block_ptr);

using char_ptr::char_ptr;
block_ptr() = default;
T* get() const {return reinterpret_cast<T*>(char_ptr::get());}
T* operator->() const noexcept { return get(); }
T& operator*() const {return *get();}
decltype(auto) get() const noexcept {return reinterpret_cast<T*>(char_ptr::get());}
decltype(auto) operator->() const noexcept { return get(); }
decltype(auto) operator*() const noexcept {return *get();}
};

template <typename T>
class unique_ptr_with_ondestroy: public conditional<unique_ptr_with_ondestroy<T>>
{
public:
~unique_ptr_with_ondestroy() { OnDestroy(); }
T* get() const { return ptr.get(); }
T* operator->() const noexcept { return ptr.operator->(); }
T& operator*() const { return *ptr; }
decltype(auto) get() const noexcept { return ptr.get(); }
decltype(auto) operator->() const noexcept { return ptr.operator->(); }
decltype(auto) operator*() const { return *ptr; }
bool operator!() const noexcept { return !ptr; }
unique_ptr_with_ondestroy& operator=(std::unique_ptr<T>&& value) noexcept { OnDestroy(); ptr = std::move(value); return *this; }
decltype(auto) operator=(std::unique_ptr<T>&& value) noexcept { OnDestroy(); ptr = std::move(value); return *this; }

private:
void OnDestroy(void) { if (ptr) ptr->OnDestroy(); }
void OnDestroy() { if (ptr) ptr->OnDestroy(); }

std::unique_ptr<T> ptr;
};
Expand All @@ -101,7 +101,7 @@ namespace detail

using file_ptr = std::unique_ptr<FILE, detail::file_closer>;

template<class T>
template<typename T>
class ptr_setter_t
{
public:
Expand All @@ -116,7 +116,7 @@ class ptr_setter_t
typename T::pointer m_RawPtr{};
};

template<class T>
template<typename T>
auto ptr_setter(T& Ptr) { return ptr_setter_t<T>(Ptr); }

#endif // SMART_PTR_HPP_DE65D1E8_C925_40F7_905A_B7E3FF40B486
2 changes: 1 addition & 1 deletion far/matrix.hpp
Expand Up @@ -93,7 +93,7 @@ class matrix
// don't call vector.resize() here:
// - it never shrinks
// - we don't care about old content
m_buffer = std::vector<T>(m_rows * m_cols);
resize_nomove(m_buffer, m_rows * m_cols);
}

// assert for <= is ok, &matirx[size] can be used as an 'end' iterator
Expand Down
8 changes: 5 additions & 3 deletions far/savescr.cpp
Expand Up @@ -185,10 +185,12 @@ void SaveScreen::Resize(int DesiredWidth, int DesiredHeight, bool SyncWithConsol
if (IsExtraTop)
{
SMALL_RECT ReadRegion = { 0, 0, static_cast<SHORT>(DesiredWidth - 1), static_cast<SHORT>(DesiredHeight - OriginalHeight - 1) };
Console().ReadOutput(Tmp, ReadRegion);
for (size_t i = 0; i != Tmp.height(); ++i)
if (Console().ReadOutput(Tmp, ReadRegion))
{
std::copy_n(Tmp[i].data(), Tmp.width(), NewBuf[i].data());
for (size_t i = 0; i != Tmp.height(); ++i)
{
std::copy_n(Tmp[i].data(), Tmp.width(), NewBuf[i].data());
}
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions far/scrbuf.cpp
Expand Up @@ -458,6 +458,16 @@ void ScreenBuf::Flush(flush_type FlushType)
}
}

if (Changes)
{
if (IsConsoleSizeChanged())
{
// We must draw something, but canvas has been changed, drawing on it will make things only worse
Changes = false;
GenerateWINDOW_BUFFER_SIZE_EVENT();
}
}

if (Changes)
{
std::for_each(CONST_RANGE(WriteList, i)
Expand Down
2 changes: 1 addition & 1 deletion far/vbuild.m4
@@ -1 +1 @@
m4_define(BUILD,4868)m4_dnl
m4_define(BUILD,4869)m4_dnl

0 comments on commit 8fe72b3

Please sign in to comment.