C++ベースのLightweightなHTTPサーバー
| Revision | 5ba1330a29fca6ed22b118cf787bd6cfe94e3ecf (tree) |
|---|---|
| Time | 2013-01-20 21:01:02 |
| Author | Michio Hirai <smg_ykz@user...> |
| Commiter | Michio Hirai |
[Function] New support of mt::AutoPtr copy syntax to/from convertible types.
| @@ -25,5 +25,11 @@ bool VectorSocket::writev(size_t& bytes_written, const IOVectorBase& vector, siz | ||
| 25 | 25 | return true; |
| 26 | 26 | } |
| 27 | 27 | |
| 28 | +int VectorSocket::release() | |
| 29 | +{ | |
| 30 | + int fd_to_return = fd_; | |
| 31 | + fd_ = -1; | |
| 32 | + return fd_to_return; | |
| 33 | +} | |
| 28 | 34 | |
| 29 | 35 | } // namespace cm |
| @@ -3,6 +3,7 @@ | ||
| 3 | 3 | |
| 4 | 4 | #include "gmock/gmock.h" |
| 5 | 5 | |
| 6 | +#include "mt_auto_ptr.h" | |
| 6 | 7 | #include "mt_typelist_algo_utility.h" |
| 7 | 8 | #include "mt_shim_clear_memory.h" |
| 8 | 9 | #include "cm_vector_socket.h" |
| @@ -76,4 +77,41 @@ TEST(CmVectorSocketTest, simple) | ||
| 76 | 77 | EXPECT_EQ(bytes_read, total_bytes_written); |
| 77 | 78 | } |
| 78 | 79 | |
| 80 | +TEST(CmVectorSocketTest, ownership_move_from_socket) | |
| 81 | +{ | |
| 82 | + cm::Socket original_sock(STDOUT_FILENO); | |
| 83 | + | |
| 84 | + cm::VectorSocket vec_sock(original_sock); | |
| 85 | + | |
| 86 | + const cm::IOVectorBase& iov = cm::IOVec()(string1, sizeof(string1) - 1) | |
| 87 | + (string2, sizeof(string2) - 1) | |
| 88 | + (string3, sizeof(string3) - 1); | |
| 89 | + | |
| 90 | + size_t bytes_written = 0u; | |
| 91 | + vec_sock.writev(bytes_written, iov); | |
| 92 | +} | |
| 93 | + | |
| 94 | +TEST(CmVectorSocketTest, ownership_move_from_socket_via_auto_ptr) | |
| 95 | +{ | |
| 96 | + mt::AutoPtr<cm::SocketIf> original_socket(new cm::Socket(STDOUT_FILENO)); | |
| 97 | + | |
| 98 | + mt::AutoPtr<cm::VectorSocket> vec_sock(original_socket); | |
| 99 | + | |
| 100 | + const cm::IOVectorBase& iov = cm::IOVec()(string1, sizeof(string1) - 1) | |
| 101 | + (string2, sizeof(string2) - 1) | |
| 102 | + (string3, sizeof(string3) - 1); | |
| 103 | + | |
| 104 | + size_t bytes_written = 0u; | |
| 105 | + vec_sock->writev(bytes_written, iov); | |
| 106 | + | |
| 107 | + mt::AutoPtr<cm::Socket> renewed_socket(vec_sock); | |
| 108 | + | |
| 109 | + std::cout << std::endl; | |
| 110 | + renewed_socket->write(bytes_written, "hello world(2)!!!", sizeof("hello world(2)!!!") - 1); | |
| 111 | + | |
| 112 | + vec_sock = renewed_socket; | |
| 113 | + | |
| 114 | + vec_sock->writev(bytes_written, iov); | |
| 115 | +} | |
| 116 | + | |
| 79 | 117 | } // namespace |
| @@ -27,6 +27,8 @@ public: | ||
| 27 | 27 | bool writev(size_t& bytes_written, const IOVectorBase& vector, size_t skip_bytes = 0u); |
| 28 | 28 | // bool readv(size_t& bytes_read, IOVector<T>& vector); |
| 29 | 29 | |
| 30 | + int release(); | |
| 31 | + | |
| 30 | 32 | private: |
| 31 | 33 | int fd_; |
| 32 | 34 | }; |
| @@ -31,8 +31,12 @@ public: | ||
| 31 | 31 | |
| 32 | 32 | AutoPtr(AutoPtr<T>& rhs) |
| 33 | 33 | : raw_ptr_(rhs.release()) |
| 34 | - { | |
| 35 | - } | |
| 34 | + {} | |
| 35 | + | |
| 36 | + template <typename X> | |
| 37 | + AutoPtr(AutoPtr<X>& rhs) | |
| 38 | + : raw_ptr_(rhs.get() ? new T(*(rhs.release())) : 0) | |
| 39 | + {} | |
| 36 | 40 | |
| 37 | 41 | AutoPtr(AutoPtrRef<T> ref) |
| 38 | 42 | : raw_ptr_(ref.raw_ptr_) |
| @@ -89,9 +93,19 @@ public: | ||
| 89 | 93 | |
| 90 | 94 | AutoPtr& operator=(AutoPtr& rhs) |
| 91 | 95 | { |
| 92 | - this->reset(); | |
| 93 | - this->set(rhs.get()); | |
| 94 | - rhs.release(); | |
| 96 | + if (this != &rhs) { | |
| 97 | + this->reset(); | |
| 98 | + this->set(rhs.get()); | |
| 99 | + rhs.release(); | |
| 100 | + } | |
| 101 | + return *this; | |
| 102 | + } | |
| 103 | + | |
| 104 | + template <typename X> | |
| 105 | + AutoPtr& operator=(AutoPtr<X>& rhs) | |
| 106 | + { | |
| 107 | + X* ptr = rhs.get(); | |
| 108 | + raw_ptr_ = ptr ? new T(*ptr) : 0; | |
| 95 | 109 | return *this; |
| 96 | 110 | } |
| 97 | 111 |