From bb472206dee0adcff09b2efccfb5795101b45705 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Tue, 19 Aug 2014 22:29:52 +0200
Subject: [PATCH] InputStream: move typedef offset_type to Offset.hxx

Reduce header dependencies.
---
 Makefile.am                                   |  1 +
 .../plugins/AudiofileDecoderPlugin.cxx        |  2 +-
 src/decoder/plugins/DsdiffDecoderPlugin.cxx   | 18 +++++-----
 src/decoder/plugins/DsfDecoderPlugin.cxx      |  4 +--
 src/decoder/plugins/FlacIOHandle.cxx          |  2 +-
 src/decoder/plugins/MadDecoderPlugin.cxx      | 10 +++---
 src/decoder/plugins/ModplugDecoderPlugin.cxx  |  2 +-
 src/decoder/plugins/OggFind.cxx               |  3 +-
 src/decoder/plugins/OggFind.hxx               |  5 +--
 src/decoder/plugins/OpusDecoderPlugin.cxx     |  4 +--
 src/decoder/plugins/PcmDecoderPlugin.cxx      |  4 +--
 src/decoder/plugins/SndfileDecoderPlugin.cxx  |  2 +-
 src/decoder/plugins/VorbisDecoderPlugin.cxx   |  2 +-
 src/decoder/plugins/WavpackDecoderPlugin.cxx  |  2 +-
 src/input/InputStream.hxx                     |  3 +-
 src/input/Offset.hxx                          | 32 ++++++++++++++++++
 test/test_rewind.cxx                          | 33 +++++++------------
 17 files changed, 77 insertions(+), 52 deletions(-)
 create mode 100644 src/input/Offset.hxx

diff --git a/Makefile.am b/Makefile.am
index 42db5520a..4bf87b3f1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1090,6 +1090,7 @@ libinput_a_SOURCES = \
 	src/input/Init.cxx src/input/Init.hxx \
 	src/input/Registry.cxx src/input/Registry.hxx \
 	src/input/Open.cxx \
+	src/input/Offset.hxx \
 	src/input/InputStream.cxx src/input/InputStream.hxx \
 	src/input/InputPlugin.hxx \
 	src/input/TextInputStream.cxx src/input/TextInputStream.hxx \
diff --git a/src/decoder/plugins/AudiofileDecoderPlugin.cxx b/src/decoder/plugins/AudiofileDecoderPlugin.cxx
index 5accff034..02f60db34 100644
--- a/src/decoder/plugins/AudiofileDecoderPlugin.cxx
+++ b/src/decoder/plugins/AudiofileDecoderPlugin.cxx
@@ -114,7 +114,7 @@ audiofile_file_seek(AFvirtualfile *vfile, AFfileoffset _offset,
 	AudioFileInputStream &afis = *(AudioFileInputStream *)vfile->closure;
 	InputStream &is = afis.is;
 
-	InputStream::offset_type offset = _offset;
+	offset_type offset = _offset;
 	if (is_relative)
 		offset += is.GetOffset();
 
diff --git a/src/decoder/plugins/DsdiffDecoderPlugin.cxx b/src/decoder/plugins/DsdiffDecoderPlugin.cxx
index 4ea2bb97c..3395f9881 100644
--- a/src/decoder/plugins/DsdiffDecoderPlugin.cxx
+++ b/src/decoder/plugins/DsdiffDecoderPlugin.cxx
@@ -110,14 +110,14 @@ dsdiff_read_payload(Decoder *decoder, InputStream &is,
 static bool
 dsdiff_read_prop_snd(Decoder *decoder, InputStream &is,
 		     DsdiffMetaData *metadata,
-		     InputStream::offset_type end_offset)
+		     offset_type end_offset)
 {
 	DsdiffChunkHeader header;
-	while ((InputStream::offset_type)(is.GetOffset() + sizeof(header)) <= end_offset) {
+	while (offset_type(is.GetOffset() + sizeof(header)) <= end_offset) {
 		if (!dsdiff_read_chunk_header(decoder, is, &header))
 			return false;
 
-		InputStream::offset_type chunk_end_offset = is.GetOffset()
+		offset_type chunk_end_offset = is.GetOffset()
 			+ header.GetSize();
 		if (chunk_end_offset > end_offset)
 			return false;
@@ -171,7 +171,7 @@ dsdiff_read_prop(Decoder *decoder, InputStream &is,
 		 const DsdiffChunkHeader *prop_header)
 {
 	uint64_t prop_size = prop_header->GetSize();
-	InputStream::offset_type end_offset = is.GetOffset() + prop_size;
+	const offset_type end_offset = is.GetOffset() + prop_size;
 
 	DsdId prop_id;
 	if (prop_size < sizeof(prop_id) ||
@@ -188,7 +188,7 @@ dsdiff_read_prop(Decoder *decoder, InputStream &is,
 static void
 dsdiff_handle_native_tag(InputStream &is,
 			 const struct tag_handler *handler,
-			 void *handler_ctx, InputStream::offset_type tagoffset,
+			 void *handler_ctx, offset_type tagoffset,
 			 TagType type)
 {
 	if (!dsdlib_skip_to(nullptr, is, tagoffset))
@@ -240,12 +240,12 @@ dsdiff_read_metadata_extra(Decoder *decoder, InputStream &is,
 		return false;
 
 	/** offset for artist tag */
-	InputStream::offset_type artist_offset = 0;
+	offset_type artist_offset = 0;
 	/** offset for title tag */
-	InputStream::offset_type title_offset = 0;
+	offset_type title_offset = 0;
 
 #ifdef HAVE_ID3TAG
-	InputStream::offset_type id3_offset = 0;
+	offset_type id3_offset = 0;
 #endif
 
 	/* Now process all the remaining chunk headers in the stream
@@ -334,7 +334,7 @@ dsdiff_read_metadata(Decoder *decoder, InputStream &is,
 		} else {
 			/* ignore unknown chunk */
 			const uint64_t chunk_size = chunk_header->GetSize();
-			InputStream::offset_type chunk_end_offset =
+			const offset_type chunk_end_offset =
 				is.GetOffset() + chunk_size;
 
 			if (!dsdlib_skip_to(decoder, is, chunk_end_offset))
diff --git a/src/decoder/plugins/DsfDecoderPlugin.cxx b/src/decoder/plugins/DsfDecoderPlugin.cxx
index b510352ee..19687d06d 100644
--- a/src/decoder/plugins/DsfDecoderPlugin.cxx
+++ b/src/decoder/plugins/DsfDecoderPlugin.cxx
@@ -44,7 +44,7 @@ struct DsfMetaData {
 	bool bitreverse;
 	uint64_t chunk_size;
 #ifdef HAVE_ID3TAG
-	InputStream::offset_type id3_offset;
+	offset_type id3_offset;
 	uint64_t id3_size;
 #endif
 };
@@ -173,7 +173,7 @@ dsf_read_metadata(Decoder *decoder, InputStream &is,
 	metadata->channels = (unsigned) dsf_fmt_chunk.channelnum;
 	metadata->sample_rate = samplefreq;
 #ifdef HAVE_ID3TAG
-	metadata->id3_offset = (InputStream::offset_type)metadata_offset;
+	metadata->id3_offset = (offset_type)metadata_offset;
 #endif
 	/* check bits per sample format, determine if bitreverse is needed */
 	metadata->bitreverse = dsf_fmt_chunk.bitssample == 1;
diff --git a/src/decoder/plugins/FlacIOHandle.cxx b/src/decoder/plugins/FlacIOHandle.cxx
index d37cea532..0dd895798 100644
--- a/src/decoder/plugins/FlacIOHandle.cxx
+++ b/src/decoder/plugins/FlacIOHandle.cxx
@@ -67,7 +67,7 @@ FlacIOSeek(FLAC__IOHandle handle, FLAC__int64 _offset, int whence)
 {
 	InputStream *is = (InputStream *)handle;
 
-	InputStream::offset_type offset = _offset;
+	offset_type offset = _offset;
 	switch (whence) {
 	case SEEK_SET:
 		break;
diff --git a/src/decoder/plugins/MadDecoderPlugin.cxx b/src/decoder/plugins/MadDecoderPlugin.cxx
index e38fe3f29..0ab9ab8a4 100644
--- a/src/decoder/plugins/MadDecoderPlugin.cxx
+++ b/src/decoder/plugins/MadDecoderPlugin.cxx
@@ -153,10 +153,10 @@ struct MadDecoder {
 	enum mp3_action DecodeNextFrame();
 
 	gcc_pure
-	InputStream::offset_type ThisFrameOffset() const;
+	offset_type ThisFrameOffset() const;
 
 	gcc_pure
-	InputStream::offset_type RestIncludingThisFrame() const;
+	offset_type RestIncludingThisFrame() const;
 
 	/**
 	 * Attempt to calulcate the length of the song from filesize
@@ -747,7 +747,7 @@ mp3_frame_duration(const struct mad_frame *frame)
 			       MAD_UNITS_MILLISECONDS) / 1000.0;
 }
 
-inline InputStream::offset_type
+inline offset_type
 MadDecoder::ThisFrameOffset() const
 {
 	auto offset = input_stream.GetOffset();
@@ -760,7 +760,7 @@ MadDecoder::ThisFrameOffset() const
 	return offset;
 }
 
-inline InputStream::offset_type
+inline offset_type
 MadDecoder::RestIncludingThisFrame() const
 {
 	return input_stream.GetSize() - ThisFrameOffset();
@@ -770,7 +770,7 @@ inline void
 MadDecoder::FileSizeToSongLength()
 {
 	if (input_stream.KnownSize()) {
-		InputStream::offset_type rest = RestIncludingThisFrame();
+		offset_type rest = RestIncludingThisFrame();
 
 		float frame_duration = mp3_frame_duration(&frame);
 
diff --git a/src/decoder/plugins/ModplugDecoderPlugin.cxx b/src/decoder/plugins/ModplugDecoderPlugin.cxx
index e76737345..110955367 100644
--- a/src/decoder/plugins/ModplugDecoderPlugin.cxx
+++ b/src/decoder/plugins/ModplugDecoderPlugin.cxx
@@ -36,7 +36,7 @@ static constexpr Domain modplug_domain("modplug");
 
 static constexpr size_t MODPLUG_FRAME_SIZE = 4096;
 static constexpr size_t MODPLUG_PREALLOC_BLOCK = 256 * 1024;
-static constexpr InputStream::offset_type MODPLUG_FILE_LIMIT = 100 * 1024 * 1024;
+static constexpr offset_type MODPLUG_FILE_LIMIT = 100 * 1024 * 1024;
 
 static int modplug_loop_count;
 
diff --git a/src/decoder/plugins/OggFind.cxx b/src/decoder/plugins/OggFind.cxx
index 15e9c5c92..978e1d7cf 100644
--- a/src/decoder/plugins/OggFind.cxx
+++ b/src/decoder/plugins/OggFind.cxx
@@ -20,6 +20,7 @@
 #include "config.h"
 #include "OggFind.hxx"
 #include "OggSyncState.hxx"
+#include "input/InputStream.hxx"
 #include "util/Error.hxx"
 
 bool
@@ -39,7 +40,7 @@ OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet)
 
 bool
 OggSeekPageAtOffset(OggSyncState &oy, ogg_stream_state &os, InputStream &is,
-		    InputStream::offset_type offset)
+		    offset_type offset)
 {
 	oy.Reset();
 
diff --git a/src/decoder/plugins/OggFind.hxx b/src/decoder/plugins/OggFind.hxx
index 8ced7fd86..2aa4f6c06 100644
--- a/src/decoder/plugins/OggFind.hxx
+++ b/src/decoder/plugins/OggFind.hxx
@@ -21,11 +21,12 @@
 #define MPD_OGG_FIND_HXX
 
 #include "check.h"
-#include "input/InputStream.hxx"
+#include "input/Offset.hxx"
 
 #include <ogg/ogg.h>
 
 class OggSyncState;
+class InputStream;
 
 /**
  * Skip all pages/packets until an end-of-stream (EOS) packet for the
@@ -41,7 +42,7 @@ OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet);
  */
 bool
 OggSeekPageAtOffset(OggSyncState &oy, ogg_stream_state &os, InputStream &is,
-		    InputStream::offset_type offset);
+		    offset_type offset);
 
 /**
  * Try to find the end-of-stream (EOS) packet.  Seek to the end of the
diff --git a/src/decoder/plugins/OpusDecoderPlugin.cxx b/src/decoder/plugins/OpusDecoderPlugin.cxx
index 2ea8e0497..d41c212f9 100644
--- a/src/decoder/plugins/OpusDecoderPlugin.cxx
+++ b/src/decoder/plugins/OpusDecoderPlugin.cxx
@@ -339,8 +339,8 @@ MPDOpusDecoder::Seek(OggSyncState &oy, double where_s)
 	/* interpolate the file offset where we expect to find the
 	   given granule position */
 	/* TODO: implement binary search */
-	InputStream::offset_type offset(where_granulepos * input_stream.GetSize()
-					/ eos_granulepos);
+	offset_type offset(where_granulepos * input_stream.GetSize()
+			   / eos_granulepos);
 
 	if (!OggSeekPageAtOffset(oy, os, input_stream, offset))
 		return false;
diff --git a/src/decoder/plugins/PcmDecoderPlugin.cxx b/src/decoder/plugins/PcmDecoderPlugin.cxx
index da8287464..f8e02500b 100644
--- a/src/decoder/plugins/PcmDecoderPlugin.cxx
+++ b/src/decoder/plugins/PcmDecoderPlugin.cxx
@@ -70,8 +70,8 @@ pcm_stream_decode(Decoder &decoder, InputStream &is)
 				       buffer, nbytes, 0)
 			: decoder_get_command(decoder);
 		if (cmd == DecoderCommand::SEEK) {
-			InputStream::offset_type offset(time_to_size *
-							decoder_seek_where(decoder));
+			offset_type offset(time_to_size *
+					   decoder_seek_where(decoder));
 
 			Error error;
 			if (is.LockSeek(offset, error)) {
diff --git a/src/decoder/plugins/SndfileDecoderPlugin.cxx b/src/decoder/plugins/SndfileDecoderPlugin.cxx
index 5aad2f16c..1e84d8be5 100644
--- a/src/decoder/plugins/SndfileDecoderPlugin.cxx
+++ b/src/decoder/plugins/SndfileDecoderPlugin.cxx
@@ -70,7 +70,7 @@ sndfile_vio_seek(sf_count_t _offset, int whence, void *user_data)
 	SndfileInputStream &sis = *(SndfileInputStream *)user_data;
 	InputStream &is = sis.is;
 
-	InputStream::offset_type offset = _offset;
+	offset_type offset = _offset;
 	switch (whence) {
 	case SEEK_SET:
 		break;
diff --git a/src/decoder/plugins/VorbisDecoderPlugin.cxx b/src/decoder/plugins/VorbisDecoderPlugin.cxx
index 72542e3a2..64a744d25 100644
--- a/src/decoder/plugins/VorbisDecoderPlugin.cxx
+++ b/src/decoder/plugins/VorbisDecoderPlugin.cxx
@@ -80,7 +80,7 @@ static int ogg_seek_cb(void *data, ogg_int64_t _offset, int whence)
 	     decoder_get_command(*vis->decoder) == DecoderCommand::STOP))
 		return -1;
 
-	InputStream::offset_type offset = _offset;
+	offset_type offset = _offset;
 	switch (whence) {
 	case SEEK_SET:
 		break;
diff --git a/src/decoder/plugins/WavpackDecoderPlugin.cxx b/src/decoder/plugins/WavpackDecoderPlugin.cxx
index 88fa2af56..248034350 100644
--- a/src/decoder/plugins/WavpackDecoderPlugin.cxx
+++ b/src/decoder/plugins/WavpackDecoderPlugin.cxx
@@ -405,7 +405,7 @@ wavpack_input_set_pos_rel(void *id, int32_t delta, int mode)
 	WavpackInput &wpi = *wpin(id);
 	InputStream &is = wpi.is;
 
-	InputStream::offset_type offset = delta;
+	offset_type offset = delta;
 	switch (mode) {
 	case SEEK_SET:
 		break;
diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx
index 19cf0a2de..15c350103 100644
--- a/src/input/InputStream.hxx
+++ b/src/input/InputStream.hxx
@@ -21,6 +21,7 @@
 #define MPD_INPUT_STREAM_HXX
 
 #include "check.h"
+#include "Offset.hxx"
 #include "thread/Mutex.hxx"
 #include "Compiler.h"
 
@@ -35,7 +36,7 @@ struct Tag;
 
 class InputStream {
 public:
-	typedef uint64_t offset_type;
+	typedef ::offset_type offset_type;
 
 private:
 	/**
diff --git a/src/input/Offset.hxx b/src/input/Offset.hxx
new file mode 100644
index 000000000..552397904
--- /dev/null
+++ b/src/input/Offset.hxx
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * http://www.musicpd.org
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPD_OFFSET_HXX
+#define MPD_OFFSET_HXX
+
+#include "check.h"
+
+#include <stdint.h>
+
+/**
+ * A type for absolute offsets in a file.
+ */
+typedef uint64_t offset_type;
+
+#endif
diff --git a/test/test_rewind.cxx b/test/test_rewind.cxx
index 193eb905f..3ab37427a 100644
--- a/test/test_rewind.cxx
+++ b/test/test_rewind.cxx
@@ -72,8 +72,7 @@ public:
 		ris->Update();
 		CPPUNIT_ASSERT(ris->IsReady());
 		CPPUNIT_ASSERT(!ris->KnownSize());
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(0),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(0), ris->GetOffset());
 
 		Error error;
 		char buffer[16];
@@ -81,50 +80,43 @@ public:
 		CPPUNIT_ASSERT_EQUAL(size_t(2), nbytes);
 		CPPUNIT_ASSERT_EQUAL('f', buffer[0]);
 		CPPUNIT_ASSERT_EQUAL('o', buffer[1]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(2),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(2), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		nbytes = ris->Read(buffer, 2, error);
 		CPPUNIT_ASSERT_EQUAL(size_t(2), nbytes);
 		CPPUNIT_ASSERT_EQUAL('o', buffer[0]);
 		CPPUNIT_ASSERT_EQUAL(' ', buffer[1]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(4),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(4), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		CPPUNIT_ASSERT(ris->Seek(1, error));
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(1),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(1), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		nbytes = ris->Read(buffer, 2, error);
 		CPPUNIT_ASSERT_EQUAL(size_t(2), nbytes);
 		CPPUNIT_ASSERT_EQUAL('o', buffer[0]);
 		CPPUNIT_ASSERT_EQUAL('o', buffer[1]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(3),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(3), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		CPPUNIT_ASSERT(ris->Seek(0, error));
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(0),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(0), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		nbytes = ris->Read(buffer, 2, error);
 		CPPUNIT_ASSERT_EQUAL(size_t(2), nbytes);
 		CPPUNIT_ASSERT_EQUAL('f', buffer[0]);
 		CPPUNIT_ASSERT_EQUAL('o', buffer[1]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(2),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(2), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		nbytes = ris->Read(buffer, sizeof(buffer), error);
 		CPPUNIT_ASSERT_EQUAL(size_t(2), nbytes);
 		CPPUNIT_ASSERT_EQUAL('o', buffer[0]);
 		CPPUNIT_ASSERT_EQUAL(' ', buffer[1]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(4),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(4), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		nbytes = ris->Read(buffer, sizeof(buffer), error);
@@ -132,13 +124,11 @@ public:
 		CPPUNIT_ASSERT_EQUAL('b', buffer[0]);
 		CPPUNIT_ASSERT_EQUAL('a', buffer[1]);
 		CPPUNIT_ASSERT_EQUAL('r', buffer[2]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(7),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(7), ris->GetOffset());
 		CPPUNIT_ASSERT(ris->IsEOF());
 
 		CPPUNIT_ASSERT(ris->Seek(3, error));
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(3),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(3), ris->GetOffset());
 		CPPUNIT_ASSERT(!ris->IsEOF());
 
 		nbytes = ris->Read(buffer, sizeof(buffer), error);
@@ -147,8 +137,7 @@ public:
 		CPPUNIT_ASSERT_EQUAL('b', buffer[1]);
 		CPPUNIT_ASSERT_EQUAL('a', buffer[2]);
 		CPPUNIT_ASSERT_EQUAL('r', buffer[3]);
-		CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(7),
-				     ris->GetOffset());
+		CPPUNIT_ASSERT_EQUAL(offset_type(7), ris->GetOffset());
 		CPPUNIT_ASSERT(ris->IsEOF());
 	}
 };