亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? externalsort.cc

?? tools.03b.zip
?? CC
字號:
// Tools Library//// Copyright (C) 2004  Navel Ltd.//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library 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// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA//// Contact information://  Mailing address://    Marios Hadjieleftheriou//    University of California, Riverside//    Department of Computer Science//    Surge Building, Room 310//    Riverside, CA 92521////  Email://    marioh@cs.ucr.edu
#include <stdio.h>
#include <unistd.h>

#include <Tools.h>

#include "ExternalSort.h"

using namespace std;

Tools::ExternalSort::PQEntry::PQEntry(
	SmartPointer<ISerializable>& r,
	IObjectComparator* pComp,
	SmartPointer<TemporaryFile>& f)
	: m_spRecord(r), m_pComp(pComp), m_spFile(f)
{
}

bool Tools::ExternalSort::PQEntry::ascendingComparator::operator()(SmartPointer<PQEntry> x, SmartPointer<PQEntry> y) const
{
	if (x->m_pComp != 0)
	{
		int ret = x->m_pComp->compare(
			dynamic_cast<IObject*>(x->m_spRecord.get()),
			dynamic_cast<IObject*>(y->m_spRecord.get()));

		if (ret == 1) return true;
		return false;
	}
	else
	{
		IComparable* pX = dynamic_cast<IComparable*>(x->m_spRecord.get());
		IComparable* pY = dynamic_cast<IComparable*>(y->m_spRecord.get());

		if (pX == 0 || pY == 0)
			throw IllegalArgumentException("Tools::ExternalSort::PQEntry::ascendingComparator: argument is not comparable.");

		if (*pX > *pY) return true;
		return false;
	}
}

Tools::ExternalSort::ExternalSort(IObjectStream& source, unsigned long bufferSize)
	: m_pExternalSource(&source),
	m_cMaxBufferSize(bufferSize),
	m_bFitsInBuffer(false),
	m_cNumberOfSortedRecords(0),
	m_pNextRecord(0),
	m_pComp(0)
{
	//m_spTemplateRecord = SmartPointer<IObject>();
	//m_spSortedFile = SmartPointer<TemporaryFile>();

	#ifndef NDEBUG
	m_cReturnedRecords = 0;
	#endif

	mergeRuns();
}

Tools::ExternalSort::ExternalSort(IObjectStream& source, IObjectComparator& comp, unsigned long bufferSize)
	: m_pExternalSource(&source),
	m_cMaxBufferSize(bufferSize),
	m_bFitsInBuffer(false),
	m_cNumberOfSortedRecords(0),
	m_pNextRecord(0),
	m_pComp(&comp)
{
	#ifndef NDEBUG
	m_cReturnedRecords = 0;
	#endif

	mergeRuns();
}

Tools::ExternalSort::~ExternalSort()
{
}

void Tools::ExternalSort::initializeRuns(deque<SmartPointer<TemporaryFile> >& runs)
{
	bool bEOF = false;

	while (! bEOF)
	{
		while (m_buffer.size() < m_cMaxBufferSize)
		{
			IObject* o = m_pExternalSource->getNext();

			if (o == 0)
			{
				bEOF = true;
				break;
			}

			SmartPointer<ISerializable> spO(dynamic_cast<ISerializable*>(o));
			if (spO.get() == 0) throw IllegalStateException("Tools::ExternalSort::initializeRuns: object is not serializable.");

			m_cNumberOfSortedRecords++;

			#ifndef NDEBUG
			if (m_cNumberOfSortedRecords % 1000000 == 0)
				std::cerr << "Tools::ExternalSort::initializeRuns: loaded " << m_cNumberOfSortedRecords << std::endl;
			#endif

			if (m_spTemplateRecord.get() == 0)
				m_spTemplateRecord = SmartPointer<IObject>(o->clone());

			SmartPointer<TemporaryFile> tf;
			m_buffer.push(SmartPointer<PQEntry>(new PQEntry(spO, m_pComp, tf)));
		}

		if (bEOF && runs.size() == 0)
		{
			#ifndef NDEBUG
			std::cerr << "Tools::ExternalSort: Dataset fits in main memory buffer." << std::endl;
			#endif
			m_bFitsInBuffer = true;
			break;
		}
		else if (m_buffer.empty())
		{
			break;
		}

		SmartPointer<TemporaryFile> tf(new TemporaryFile());
		while (! m_buffer.empty())
		{
			SmartPointer<PQEntry> pqe = m_buffer.top(); m_buffer.pop();
			tf->storeNextObject(pqe->m_spRecord.get());
		}

		tf->rewindForReading();
		runs.push_back(tf);
	}
}

void Tools::ExternalSort::mergeRuns()
{
	deque<SmartPointer<TemporaryFile> > newruns;
	deque<SmartPointer<TemporaryFile> > runs;
	initializeRuns(runs);

	if (m_bFitsInBuffer)
	{
		if (! m_buffer.empty())
		{
			SmartPointer<PQEntry> pqe = m_buffer.top(); m_buffer.pop();
			m_pNextRecord = dynamic_cast<ISerializable*>(dynamic_cast<IObject*>(pqe->m_spRecord.get())->clone());
		}
	}
	else
	{
		while (runs.size() > 1)
		{
			SmartPointer<TemporaryFile> output(new TemporaryFile());
			priority_queue<SmartPointer<PQEntry>, vector<SmartPointer<PQEntry> >, PQEntry::ascendingComparator> buffer;

			unsigned long cRun = 0, cMaxRun = 0;
			while (buffer.size() < m_cMaxBufferSize)
			{
				SmartPointer<ISerializable> spO(dynamic_cast<ISerializable*>(m_spTemplateRecord->clone()));
				try
				{
					runs[cRun]->loadNextObject(spO.get());
					buffer.push(SmartPointer<PQEntry>(new PQEntry(spO, m_pComp, runs[cRun])));
				}
				catch (EndOfStreamException& e)
				{
					// if there are no more records in the file, do nothing.
				}

				cMaxRun = std::max(cRun, cMaxRun);
				cRun++;
				if (cRun == runs.size()) cRun = 0;
			}

			while (! buffer.empty())
			{
				SmartPointer<PQEntry> pqe = buffer.top(); buffer.pop();
				output->storeNextObject(pqe->m_spRecord.get());

				try
				{
					// no one else is pointing to the same record (hopefully).
					pqe->m_spFile->loadNextObject(pqe->m_spRecord.get());
					buffer.push(pqe);
				}
				catch (EndOfStreamException& e)
				{
					// if there are no more records in the file, do nothing.
				}
			}

			output->rewindForReading();
			newruns.push_back(output);

			for (cRun = 0; cRun <= cMaxRun; cRun++) runs.pop_front();

			if (runs.empty())
			{
				runs.push_back(newruns.front());
				newruns.pop_front();
			}
		}

		runs[0]->rewindForReading();
		m_spSortedFile = runs[0];

		try
		{
			m_pNextRecord = dynamic_cast<ISerializable*>(m_spTemplateRecord->clone());
			m_spSortedFile->loadNextObject(m_pNextRecord);
		}
		catch (EndOfStreamException& e)
		{
			delete m_pNextRecord;
			m_pNextRecord = 0;
		}
	}
}

Tools::IObject* Tools::ExternalSort::getNext()
{
	if (m_pNextRecord == 0)
	{
#ifndef NDEBUG
		assert(m_cReturnedRecords == m_cNumberOfSortedRecords);
#endif
		return 0;
	}

	IObject* ret = dynamic_cast<IObject*>(m_pNextRecord);

	if (m_bFitsInBuffer)
	{
		if (m_buffer.empty()) m_pNextRecord = 0;
		else
		{
			SmartPointer<PQEntry> pqe = m_buffer.top(); m_buffer.pop();
			m_pNextRecord = dynamic_cast<ISerializable*>(dynamic_cast<IObject*>(pqe->m_spRecord.get())->clone());
		}
	}
	else
	{
		try
		{
			m_pNextRecord = dynamic_cast<ISerializable*>(m_spTemplateRecord->clone());
			m_spSortedFile->loadNextObject(m_pNextRecord);
		}
		catch (EndOfStreamException& e)
		{
			delete m_pNextRecord;
			m_pNextRecord = 0;
		}
	}

#ifndef NDEBUG
	m_cReturnedRecords++;
#endif

	return ret;
}

bool Tools::ExternalSort::hasNext()
{
	if (m_pNextRecord == 0)
	{
#ifndef NDEBUG
		assert(m_cReturnedRecords == m_cNumberOfSortedRecords);
#endif

		return false;
	}

	return true;
}

unsigned long Tools::ExternalSort::size() throw (NotSupportedException)
{
	return m_cNumberOfSortedRecords;
}

bool Tools::ExternalSort::rewind() throw (NotSupportedException)
{
	try
	{
		m_spSortedFile->rewindForReading();
		return true;
	}
	catch (...)
	{
		return false;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频1区2区| 精品在线免费观看| 欧美日韩在线综合| 精品一区二区三区久久| 精品少妇一区二区三区视频免付费 | 欧美成人性战久久| 欧美精品tushy高清| 欧美日韩一区二区欧美激情| 欧美一a一片一级一片| 在线影视一区二区三区| 欧美卡1卡2卡| 欧美一级黄色大片| 国产嫩草影院久久久久| 国产亚洲一区二区三区| 国产亚洲精品资源在线26u| 国产精品天美传媒| 亚洲免费观看视频| 亚洲国产美国国产综合一区二区| 亚洲国产毛片aaaaa无费看 | 欧美日韩亚洲不卡| 欧美一区二区三区在线电影| 日韩精品中文字幕一区二区三区| 久久久亚洲精品石原莉奈| 中文一区一区三区高中清不卡| 国产精品情趣视频| 亚洲无线码一区二区三区| 美腿丝袜亚洲综合| 成人高清视频在线观看| 欧美色图免费看| 欧美精品一区二区三区蜜臀| 自拍偷自拍亚洲精品播放| 亚洲国产va精品久久久不卡综合| 五月婷婷色综合| 福利一区二区在线| 91黄色免费看| 久久久久久日产精品| 亚洲欧美日韩国产综合在线| 麻豆91精品91久久久的内涵| 成人动漫一区二区| 538在线一区二区精品国产| 国产日韩欧美不卡在线| 亚洲福利视频导航| 成人的网站免费观看| 欧美一区二区三区在线电影| 一区在线观看视频| 极品少妇xxxx精品少妇| 粉嫩aⅴ一区二区三区四区五区 | 91精彩视频在线观看| 久久久久久久久一| 五月天婷婷综合| 99视频有精品| 精品国产露脸精彩对白| 天堂一区二区在线| 91在线精品一区二区三区| 国产亚洲欧美在线| 毛片av一区二区| 欧美日韩日本视频| 一区二区视频在线| 成人毛片在线观看| 久久久国产精华| 卡一卡二国产精品| 欧美精品少妇一区二区三区| 久久色成人在线| 美女国产一区二区三区| 欧美视频中文字幕| 国产精品视频在线看| 经典三级在线一区| 精品久久久久久无| 人禽交欧美网站| 91.xcao| 蜜桃av噜噜一区| 欧美一二三区在线| 美女任你摸久久| 精品国产一区二区亚洲人成毛片| 日韩av电影免费观看高清完整版 | 日韩av高清在线观看| 欧美另类变人与禽xxxxx| 亚洲在线中文字幕| 欧美色男人天堂| 午夜欧美大尺度福利影院在线看| 色呦呦国产精品| 亚洲精品免费一二三区| 色8久久人人97超碰香蕉987| 亚洲美女免费在线| 91成人在线精品| 日日夜夜精品视频天天综合网| 欧美性生活一区| 日韩vs国产vs欧美| 欧美变态口味重另类| 精品一区二区在线观看| 久久影院午夜论| 从欧美一区二区三区| 亚洲欧美色综合| 欧美性感一区二区三区| 日韩激情视频在线观看| 26uuu国产日韩综合| 国产福利一区二区三区视频| 国产精品久久久久久久第一福利| 99久久久精品免费观看国产蜜| 一区二区三区四区中文字幕| 欧美高清www午色夜在线视频| 久久99热这里只有精品| 国产色91在线| 在线观看av一区| 九九热在线视频观看这里只有精品| 2021中文字幕一区亚洲| av不卡在线播放| 爽爽淫人综合网网站| 久久久久一区二区三区四区| 91美女视频网站| 老汉av免费一区二区三区| 欧美激情一区二区三区| 欧美日精品一区视频| 国产伦精品一区二区三区免费迷| 亚洲欧洲日产国码二区| 日韩精品中文字幕一区二区三区| 成人毛片视频在线观看| 男人的天堂亚洲一区| 国产精品福利av| 欧美成人性战久久| 欧美日韩国产一二三| 国产精品中文有码| 日本女优在线视频一区二区| 国产精品初高中害羞小美女文| 在线成人小视频| 97se亚洲国产综合自在线观| 久久99精品久久久久久国产越南| 亚洲视频一区在线| 国产日韩欧美精品在线| 久久久不卡网国产精品一区| 欧美日韩视频专区在线播放| 国产成人午夜精品影院观看视频| 亚洲图片自拍偷拍| 1000精品久久久久久久久| 欧美精品一区二区在线播放 | 日韩欧美www| 4438成人网| 在线观看日韩精品| 97成人超碰视| 成人av在线影院| 国产电影一区二区三区| 秋霞成人午夜伦在线观看| 亚洲国产精品麻豆| 一二三四社区欧美黄| 亚洲欧洲av一区二区三区久久| 精品成人一区二区| 日韩欧美高清在线| 日韩女优制服丝袜电影| 欧美一区二区女人| 91精品国产美女浴室洗澡无遮挡| 欧美性色欧美a在线播放| 在线视频欧美精品| 欧美在线不卡一区| 91福利在线观看| 欧美色成人综合| 在线精品观看国产| 欧美人牲a欧美精品| 欧美性大战久久久久久久蜜臀 | 色综合激情五月| 一本大道久久a久久精品综合| 99热在这里有精品免费| 91丝袜美腿高跟国产极品老师| av在线不卡电影| 日本高清不卡视频| 欧美色视频在线| 91精品国产日韩91久久久久久| 欧美精品99久久久**| 日韩欧美一区二区在线视频| 日韩三级精品电影久久久| 精品国产欧美一区二区| 国产亚洲欧美在线| 亚洲欧美国产三级| 视频一区二区中文字幕| 久久99精品国产91久久来源| 国产精品一区二区视频| 成人精品电影在线观看| 欧美探花视频资源| 精品国产污污免费网站入口 | 日韩欧美国产精品| 欧美国产乱子伦| 亚洲综合在线第一页| 亚洲成a人v欧美综合天堂| 免费看欧美女人艹b| 大桥未久av一区二区三区中文| 99国产精品国产精品久久| 欧美日韩三级一区二区| 久久人人爽爽爽人久久久| 亚洲色图欧洲色图婷婷| 日韩精品福利网| 成人app软件下载大全免费| 欧美三级蜜桃2在线观看| 精品国产亚洲在线| 亚洲资源中文字幕| 国产精品1区2区3区| 欧美色图激情小说| 国产精品视频观看| 蜜桃一区二区三区四区| 色天使色偷偷av一区二区| 精品三级av在线| 亚洲国产一区二区在线播放|