/* libobby - Network text editing library
 * Copyright (C) 2005, 2006 0x539 dev group
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "split_operation.hpp"

#if 0
obby::split_operation::split_operation(const operation& first,
                                       const operation& second)
 : operation(), m_first(first.clone() ), m_second(second.clone() )
{
}

obby::split_operation::split_operation(operation* first, operation* second)
 : operation(), m_first(first), m_second(second)
{
}

obby::split_operation::split_operation(const net6::packet& pack,
                                       unsigned int& index,
                                       const user_table& user_table)
 : operation(),
   m_first(operation::from_packet(pack, index, user_table).release() ),
   m_second(operation::from_packet(pack, index, user_table).release() )
{
//	std::auto_ptr<operation> first = operation::from_packet(pack, index);
//	std::auto_ptr<operation> second = operation::from_packet(pack, index);
//
//	m_first = first.get();
//	m_second = second.get();
//
//	m_first.release();
//	m_second.release();
}

obby::operation* obby::split_operation::clone() const
{
	return new split_operation(*m_first, *m_second);
}

obby::operation* obby::split_operation::reverse(const document& doc) const
{
	return new split_operation(
		m_first->reverse(doc),
		m_second->reverse(doc)
	);
}

void obby::split_operation::apply(document& doc, const user* author) const
{
	m_first->apply(doc, author);

	// Transform second operation against first because the first one
	// has already been applied to the document.
	std::auto_ptr<operation> second(m_first->transform(*m_second) );
	second->apply(doc, author);
}

obby::operation*
obby::split_operation::transform(const operation& base_op) const
{
	// Transform base_op against second operation
	std::auto_ptr<operation> op1(m_second->transform(base_op) );
	// Transform result against first
	return m_first->transform(*op1);
}

obby::operation*
obby::split_operation::transform_insert(position pos,
                                        const std::string& text) const
{
	return new split_operation(
		m_first->transform_insert(pos, text),
		m_second->transform_insert(pos, text)
	);
}

obby::operation*
obby::split_operation::transform_delete(position pos, position len) const
{
	return new split_operation(
		m_first->transform_delete(pos, len),
		m_second->transform_delete(pos, len)
	);
}

void obby::split_operation::append_packet(net6::packet& pack) const
{
	pack << "split";
	m_first->append_packet(pack);
	m_second->append_packet(pack);
}
#endif


syntax highlighted by Code2HTML, v. 0.9.1