Example #1
0
                        bool getNextPatternUnlocked(pattern_type & pattern)
                        {
                        	if ( keep_pairs && pairflag )
                        	{
                        		pairflag = false;
                        		return Preader->getNextPatternUnlocked(pattern);
                        	}
                        	else
                        	{
                        		while ( true )
                        		{
                        			uint64_t const z = rand16() % d;
                        			
                        			// RNG keep
                        			if ( z < c )
                        			{
                        				bool const ok = Preader->getNextPatternUnlocked(pattern);
                        				
                        				if ( ok )
                        				{
                        					if ( keep_pairs )
                        						pairflag = true;
								return true;
                        				}
                        				else
                        				{
                        					// no more reads
                        					return false;
                        				}
                        			}
                        			// RNG drop
                        			else
                        			{
                        				uint64_t const skipcnt = keep_pairs ? 2 : 1;
                        				
                        				for ( uint64_t i = 0; i < skipcnt; ++i )
							{
	                        				bool const ok = Preader->getNextPatternUnlocked(pattern);
								if ( ! ok )
									return false;
							}
                        			}
                        		}
                        	}
                        }
			bool getBuffer(std::pair < char const *, ssize_t > & data)
			{
				if ( ! (reader.get()) )
					return false;
			
				if ( reader->getBuffer(data) )
					return true;

				if ( ita != ite )
				{
					while ( ++ita != ite )
					{
						reader.reset();
						reader = UNIQUE_PTR_MOVE(reader_ptr_type(new AsynchronousBufferReader(*ita,numbuffers,bufsize,0)));
						if ( reader->getBuffer(data) )
							return true;
					}
				}

				return false;
			}
			/**
			 * return the last block obtained via getBuffer
			 **/
			void returnBuffer()
			{
				if ( reader.get() )
					reader->returnBuffer();
			}
			/**
			 * destructor
			 **/
			~AsynchronousBufferReaderList()
			{
				if ( reader.get() )
					reader->flush();
			}