BasicColumn<T>::BasicColumn(Allocator& alloc, ref_type ref)
{
    char* header = alloc.translate(ref);
    bool root_is_leaf = !Array::get_is_inner_bptree_node_from_header(header);
    if (root_is_leaf) {
        BasicArray<T>* root = new BasicArray<T>(alloc); // Throws
        root->init_from_mem(MemRef(header, ref));
        m_array = root;
    }
    else {
        Array* root = new Array(alloc); // Throws
        root->init_from_mem(MemRef(header, ref));
        m_array = root;
    }
}
inline void ArrayStringLong::init_from_ref(ref_type ref) noexcept
{
    REALM_ASSERT(ref);
    char* header = get_alloc().translate(ref);
    init_from_mem(MemRef(header, ref));
    m_nullable = (Array::size() == 3);
}
bool NetMessageSocket::readMessage()
{
	writeMessage("GET", MemRef(key, keysize));
	flush();

	buf_.clear();
	NetMessageReader parser(&buf_);

	socket_->read(buf_);
	parser.parse();

	if (parser.state() != NetMessageReader::MESSAGE_END) {
		// protocol error
		TRACE("protocol error: %d", parser.state());
		return false;
	}

	NetMessage* message = parser.message();

	switch (message->type()) {
		case NetMessage::Array:
		case NetMessage::Status:
		case NetMessage::Number:
			// unexpected result type, but yeah
		case NetMessage::String:
			val.clear();
			val.push_back(message->toString());
			return true;
		case NetMessage::Nil:
			val.clear();
			return true;
		case NetMessage::Error:
		default:
			TRACE("unknown type");
			return false;
	}
}
inline void ArrayBinary::init_from_ref(ref_type ref) noexcept
{
    REALM_ASSERT(ref);
    char* header = get_alloc().translate(ref);
    init_from_mem(MemRef(header, ref, m_alloc));
}