From 33a2696b342664f98af0b571d2517bd2ea333193 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Tue, 14 Jun 2022 10:24:08 +0100 Subject: [PATCH] Update Linux-specific Makefile --- .build.yml | 1 + Doxyfile | 2 +- otherbuilds/Makefile.linux | 278 +++++++++++++++++-------------- rubberband/RubberBandStretcher.h | 4 +- rubberband/rubberband-c.h | 4 +- src/finer/R3StretcherImpl.h | 2 +- 6 files changed, 158 insertions(+), 133 deletions(-) diff --git a/.build.yml b/.build.yml index 5402296..8425bcf 100644 --- a/.build.yml +++ b/.build.yml @@ -18,6 +18,7 @@ tasks: - build: | cd rubberband ninja -C build + meson test -C build ./otherbuilds/check.sh triggers: - action: email diff --git a/Doxyfile b/Doxyfile index bc70bb7..54f01b3 100644 --- a/Doxyfile +++ b/Doxyfile @@ -31,7 +31,7 @@ PROJECT_NAME = "Rubber Band Library" # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 2.0.2 +PROJECT_NUMBER = 3.0.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/otherbuilds/Makefile.linux b/otherbuilds/Makefile.linux index ec361bf..fe52c77 100644 --- a/otherbuilds/Makefile.linux +++ b/otherbuilds/Makefile.linux @@ -25,51 +25,25 @@ PUBLIC_INCLUDES := \ rubberband/rubberband-c.h \ rubberband/RubberBandStretcher.h -LIBRARY_INCLUDES := \ - src/StretcherChannelData.h \ - src/float_cast/float_cast.h \ - src/StretcherImpl.h \ - src/StretchCalculator.h \ - src/base/Profiler.h \ - src/base/RingBuffer.h \ - src/base/Scavenger.h \ - src/dsp/AudioCurveCalculator.h \ - src/audiocurves/CompoundAudioCurve.h \ - src/audiocurves/ConstantAudioCurve.h \ - src/audiocurves/HighFrequencyAudioCurve.h \ - src/audiocurves/PercussiveAudioCurve.h \ - src/audiocurves/SilentAudioCurve.h \ - src/audiocurves/SpectralDifferenceAudioCurve.h \ - src/dsp/Resampler.h \ - src/dsp/FFT.h \ - src/dsp/MovingMedian.h \ - src/dsp/SincWindow.h \ - src/dsp/Window.h \ - src/system/Allocators.h \ - src/system/Thread.h \ - src/system/VectorOps.h \ - src/system/sysutils.h - LIBRARY_SOURCES := \ src/rubberband-c.cpp \ src/RubberBandStretcher.cpp \ - src/StretcherProcess.cpp \ - src/StretchCalculator.cpp \ - src/base/Profiler.cpp \ - src/dsp/AudioCurveCalculator.cpp \ - src/audiocurves/CompoundAudioCurve.cpp \ - src/audiocurves/SpectralDifferenceAudioCurve.cpp \ - src/audiocurves/HighFrequencyAudioCurve.cpp \ - src/audiocurves/SilentAudioCurve.cpp \ - src/audiocurves/ConstantAudioCurve.cpp \ - src/audiocurves/PercussiveAudioCurve.cpp \ - src/dsp/Resampler.cpp \ - src/dsp/FFT.cpp \ - src/system/Allocators.cpp \ - src/system/sysutils.cpp \ - src/system/Thread.cpp \ - src/StretcherChannelData.cpp \ - src/StretcherImpl.cpp + src/faster/AudioCurveCalculator.cpp \ + src/faster/CompoundAudioCurve.cpp \ + src/faster/HighFrequencyAudioCurve.cpp \ + src/faster/SilentAudioCurve.cpp \ + src/faster/PercussiveAudioCurve.cpp \ + src/faster/StretcherChannelData.cpp \ + src/faster/StretcherImpl.cpp \ + src/faster/StretcherProcess.cpp \ + src/common/Profiler.cpp \ + src/common/Resampler.cpp \ + src/common/FFT.cpp \ + src/common/Allocators.cpp \ + src/common/StretchCalculator.cpp \ + src/common/sysutils.cpp \ + src/common/Thread.cpp \ + src/finer/R3StretcherImpl.cpp LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o) LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o) @@ -94,88 +68,138 @@ depend: src/rubberband-c.o: rubberband/rubberband-c.h src/rubberband-c.o: rubberband/RubberBandStretcher.h -src/RubberBandStretcher.o: src/StretcherImpl.h -src/RubberBandStretcher.o: rubberband/RubberBandStretcher.h src/dsp/Window.h -src/RubberBandStretcher.o: src/dsp/SincWindow.h src/dsp/FFT.h -src/RubberBandStretcher.o: src/audiocurves/CompoundAudioCurve.h -src/RubberBandStretcher.o: src/dsp/AudioCurveCalculator.h -src/RubberBandStretcher.o: src/audiocurves/PercussiveAudioCurve.h -src/RubberBandStretcher.o: src/audiocurves/HighFrequencyAudioCurve.h -src/RubberBandStretcher.o: src/dsp/SampleFilter.h src/base/RingBuffer.h -src/RubberBandStretcher.o: src/base/Scavenger.h src/system/Thread.h -src/RubberBandStretcher.o: src/system/sysutils.h -src/StretcherProcess.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h -src/StretcherProcess.o: src/dsp/Window.h src/dsp/SincWindow.h src/dsp/FFT.h -src/StretcherProcess.o: src/audiocurves/CompoundAudioCurve.h -src/StretcherProcess.o: src/dsp/AudioCurveCalculator.h -src/StretcherProcess.o: src/audiocurves/PercussiveAudioCurve.h -src/StretcherProcess.o: src/audiocurves/HighFrequencyAudioCurve.h -src/StretcherProcess.o: src/dsp/SampleFilter.h src/base/RingBuffer.h -src/StretcherProcess.o: src/base/Scavenger.h src/system/Thread.h -src/StretcherProcess.o: src/system/sysutils.h src/audiocurves/PercussiveAudioCurve.h -src/StretcherProcess.o: src/audiocurves/HighFrequencyAudioCurve.h -src/StretcherProcess.o: src/audiocurves/ConstantAudioCurve.h src/StretchCalculator.h -src/StretcherProcess.o: src/StretcherChannelData.h src/dsp/Resampler.h -src/StretcherProcess.o: src/base/Profiler.h src/system/VectorOps.h -src/StretcherProcess.o: src/system/sysutils.h -src/StretchCalculator.o: src/StretchCalculator.h src/system/sysutils.h -src/base/Profiler.o: src/base/Profiler.h src/system/sysutils.h -src/dsp/AudioCurveCalculator.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/CompoundAudioCurve.o: src/audiocurves/CompoundAudioCurve.h -src/audiocurves/CompoundAudioCurve.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/CompoundAudioCurve.o: src/audiocurves/PercussiveAudioCurve.h -src/audiocurves/CompoundAudioCurve.o: src/audiocurves/HighFrequencyAudioCurve.h -src/audiocurves/CompoundAudioCurve.o: src/dsp/SampleFilter.h src/dsp/MovingMedian.h -src/audiocurves/SpectralDifferenceAudioCurve.o: src/audiocurves/SpectralDifferenceAudioCurve.h -src/audiocurves/SpectralDifferenceAudioCurve.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/SpectralDifferenceAudioCurve.o: src/dsp/Window.h -src/audiocurves/SpectralDifferenceAudioCurve.o: src/system/sysutils.h -src/audiocurves/SpectralDifferenceAudioCurve.o: src/system/VectorOps.h -src/audiocurves/SpectralDifferenceAudioCurve.o: src/system/sysutils.h -src/audiocurves/HighFrequencyAudioCurve.o: src/audiocurves/HighFrequencyAudioCurve.h -src/audiocurves/HighFrequencyAudioCurve.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/SilentAudioCurve.o: src/audiocurves/SilentAudioCurve.h -src/audiocurves/SilentAudioCurve.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/ConstantAudioCurve.o: src/audiocurves/ConstantAudioCurve.h -src/audiocurves/ConstantAudioCurve.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/PercussiveAudioCurve.o: src/audiocurves/PercussiveAudioCurve.h -src/audiocurves/PercussiveAudioCurve.o: src/dsp/AudioCurveCalculator.h -src/audiocurves/PercussiveAudioCurve.o: src/system/VectorOps.h src/system/sysutils.h -src/dsp/Resampler.o: src/dsp/Resampler.h src/system/sysutils.h -src/dsp/Resampler.o: src/base/Profiler.h -src/dsp/FFT.o: src/dsp/FFT.h src/system/sysutils.h src/system/Thread.h -src/dsp/FFT.o: src/base/Profiler.h src/system/VectorOps.h -src/dsp/FFT.o: src/system/sysutils.h -src/system/Allocators.o: src/system/Allocators.h src/system/VectorOps.h -src/system/Allocators.o: src/system/sysutils.h -src/system/sysutils.o: src/system/sysutils.h -src/system/Thread.o: src/system/Thread.h -src/StretcherChannelData.o: src/StretcherChannelData.h src/StretcherImpl.h -src/StretcherChannelData.o: rubberband/RubberBandStretcher.h src/dsp/Window.h -src/StretcherChannelData.o: src/dsp/SincWindow.h src/dsp/FFT.h -src/StretcherChannelData.o: src/audiocurves/CompoundAudioCurve.h -src/StretcherChannelData.o: src/dsp/AudioCurveCalculator.h -src/StretcherChannelData.o: src/audiocurves/PercussiveAudioCurve.h -src/StretcherChannelData.o: src/audiocurves/HighFrequencyAudioCurve.h -src/StretcherChannelData.o: src/dsp/SampleFilter.h src/base/RingBuffer.h -src/StretcherChannelData.o: src/base/Scavenger.h src/system/Thread.h -src/StretcherChannelData.o: src/system/sysutils.h src/dsp/Resampler.h -src/StretcherChannelData.o: src/system/Allocators.h src/system/VectorOps.h -src/StretcherChannelData.o: src/system/sysutils.h -src/StretcherImpl.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h -src/StretcherImpl.o: src/dsp/Window.h src/dsp/SincWindow.h src/dsp/FFT.h -src/StretcherImpl.o: src/audiocurves/CompoundAudioCurve.h -src/StretcherImpl.o: src/dsp/AudioCurveCalculator.h -src/StretcherImpl.o: src/audiocurves/PercussiveAudioCurve.h -src/StretcherImpl.o: src/audiocurves/HighFrequencyAudioCurve.h src/dsp/SampleFilter.h -src/StretcherImpl.o: src/base/RingBuffer.h src/base/Scavenger.h -src/StretcherImpl.o: src/system/Thread.h src/system/sysutils.h -src/StretcherImpl.o: src/audiocurves/PercussiveAudioCurve.h -src/StretcherImpl.o: src/audiocurves/HighFrequencyAudioCurve.h -src/StretcherImpl.o: src/audiocurves/SpectralDifferenceAudioCurve.h src/dsp/Window.h -src/StretcherImpl.o: src/system/VectorOps.h src/system/sysutils.h -src/StretcherImpl.o: src/audiocurves/SilentAudioCurve.h src/audiocurves/ConstantAudioCurve.h -src/StretcherImpl.o: src/dsp/Resampler.h src/StretchCalculator.h -src/StretcherImpl.o: src/StretcherChannelData.h src/base/Profiler.h -main/main.o: rubberband/RubberBandStretcher.h src/system/sysutils.h -main/main.o: src/base/Profiler.h +src/RubberBandStretcher.o: src/faster/StretcherImpl.h +src/RubberBandStretcher.o: rubberband/RubberBandStretcher.h +src/RubberBandStretcher.o: src/common/Window.h src/common/sysutils.h +src/RubberBandStretcher.o: src/common/VectorOps.h src/common/Allocators.h +src/RubberBandStretcher.o: src/common/FFT.h src/common/RingBuffer.h +src/RubberBandStretcher.o: src/common/Scavenger.h src/common/Thread.h +src/RubberBandStretcher.o: src/common/Thread.h src/common/sysutils.h +src/RubberBandStretcher.o: src/faster/SincWindow.h src/common/VectorOps.h +src/RubberBandStretcher.o: src/common/Allocators.h +src/RubberBandStretcher.o: src/faster/CompoundAudioCurve.h +src/RubberBandStretcher.o: src/faster/PercussiveAudioCurve.h +src/RubberBandStretcher.o: src/faster/AudioCurveCalculator.h +src/RubberBandStretcher.o: src/faster/HighFrequencyAudioCurve.h +src/RubberBandStretcher.o: src/common/SampleFilter.h +src/RubberBandStretcher.o: src/finer/R3StretcherImpl.h +src/RubberBandStretcher.o: src/finer/BinSegmenter.h src/finer/BinClassifier.h +src/RubberBandStretcher.o: src/common/MovingMedian.h +src/RubberBandStretcher.o: src/common/SampleFilter.h src/common/FixedVector.h +src/RubberBandStretcher.o: src/common/SingleThreadRingBuffer.h +src/RubberBandStretcher.o: src/common/HistogramFilter.h src/common/mathmisc.h +src/RubberBandStretcher.o: src/finer/Guide.h src/finer/Peak.h +src/RubberBandStretcher.o: src/finer/PhaseAdvance.h +src/RubberBandStretcher.o: src/common/StretchCalculator.h +src/RubberBandStretcher.o: src/common/Resampler.h src/common/FixedVector.h +src/RubberBandStretcher.o: rubberband/RubberBandStretcher.h +src/faster/AudioCurveCalculator.o: src/faster/AudioCurveCalculator.h +src/faster/AudioCurveCalculator.o: src/common/sysutils.h +src/faster/CompoundAudioCurve.o: src/faster/CompoundAudioCurve.h +src/faster/CompoundAudioCurve.o: src/faster/PercussiveAudioCurve.h +src/faster/CompoundAudioCurve.o: src/faster/AudioCurveCalculator.h +src/faster/CompoundAudioCurve.o: src/common/sysutils.h +src/faster/CompoundAudioCurve.o: src/faster/HighFrequencyAudioCurve.h +src/faster/CompoundAudioCurve.o: src/common/SampleFilter.h +src/faster/CompoundAudioCurve.o: src/common/MovingMedian.h +src/faster/CompoundAudioCurve.o: src/common/SampleFilter.h +src/faster/CompoundAudioCurve.o: src/common/FixedVector.h +src/faster/CompoundAudioCurve.o: src/common/Allocators.h +src/faster/CompoundAudioCurve.o: src/common/VectorOps.h src/common/sysutils.h +src/faster/CompoundAudioCurve.o: src/common/SingleThreadRingBuffer.h +src/faster/HighFrequencyAudioCurve.o: src/faster/HighFrequencyAudioCurve.h +src/faster/HighFrequencyAudioCurve.o: src/faster/AudioCurveCalculator.h +src/faster/HighFrequencyAudioCurve.o: src/common/sysutils.h +src/faster/SilentAudioCurve.o: src/faster/SilentAudioCurve.h +src/faster/SilentAudioCurve.o: src/faster/AudioCurveCalculator.h +src/faster/SilentAudioCurve.o: src/common/sysutils.h +src/faster/PercussiveAudioCurve.o: src/faster/PercussiveAudioCurve.h +src/faster/PercussiveAudioCurve.o: src/faster/AudioCurveCalculator.h +src/faster/PercussiveAudioCurve.o: src/common/sysutils.h +src/faster/PercussiveAudioCurve.o: src/common/Allocators.h +src/faster/PercussiveAudioCurve.o: src/common/VectorOps.h +src/faster/StretcherChannelData.o: src/faster/StretcherChannelData.h +src/faster/StretcherChannelData.o: src/faster/StretcherImpl.h +src/faster/StretcherChannelData.o: rubberband/RubberBandStretcher.h +src/faster/StretcherChannelData.o: src/common/Window.h src/common/sysutils.h +src/faster/StretcherChannelData.o: src/common/VectorOps.h +src/faster/StretcherChannelData.o: src/common/Allocators.h src/common/FFT.h +src/faster/StretcherChannelData.o: src/common/RingBuffer.h +src/faster/StretcherChannelData.o: src/common/Scavenger.h src/common/Thread.h +src/faster/StretcherChannelData.o: src/common/Thread.h src/common/sysutils.h +src/faster/StretcherChannelData.o: src/faster/SincWindow.h +src/faster/StretcherChannelData.o: src/common/VectorOps.h +src/faster/StretcherChannelData.o: src/common/Allocators.h +src/faster/StretcherChannelData.o: src/faster/CompoundAudioCurve.h +src/faster/StretcherChannelData.o: src/faster/PercussiveAudioCurve.h +src/faster/StretcherChannelData.o: src/faster/AudioCurveCalculator.h +src/faster/StretcherChannelData.o: src/faster/HighFrequencyAudioCurve.h +src/faster/StretcherChannelData.o: src/common/SampleFilter.h +src/faster/StretcherChannelData.o: src/common/Resampler.h +src/faster/StretcherImpl.o: src/faster/StretcherImpl.h +src/faster/StretcherImpl.o: rubberband/RubberBandStretcher.h +src/faster/StretcherImpl.o: src/common/Window.h src/common/sysutils.h +src/faster/StretcherImpl.o: src/common/VectorOps.h src/common/Allocators.h +src/faster/StretcherImpl.o: src/common/FFT.h src/common/RingBuffer.h +src/faster/StretcherImpl.o: src/common/Scavenger.h src/common/Thread.h +src/faster/StretcherImpl.o: src/common/Thread.h src/common/sysutils.h +src/faster/StretcherImpl.o: src/faster/SincWindow.h src/common/VectorOps.h +src/faster/StretcherImpl.o: src/common/Allocators.h +src/faster/StretcherImpl.o: src/faster/CompoundAudioCurve.h +src/faster/StretcherImpl.o: src/faster/PercussiveAudioCurve.h +src/faster/StretcherImpl.o: src/faster/AudioCurveCalculator.h +src/faster/StretcherImpl.o: src/faster/HighFrequencyAudioCurve.h +src/faster/StretcherImpl.o: src/common/SampleFilter.h +src/faster/StretcherImpl.o: src/faster/SilentAudioCurve.h +src/faster/StretcherImpl.o: src/faster/StretcherChannelData.h +src/faster/StretcherImpl.o: src/common/StretchCalculator.h +src/faster/StretcherImpl.o: src/common/Resampler.h src/common/Profiler.h +src/faster/StretcherProcess.o: src/faster/StretcherImpl.h +src/faster/StretcherProcess.o: rubberband/RubberBandStretcher.h +src/faster/StretcherProcess.o: src/common/Window.h src/common/sysutils.h +src/faster/StretcherProcess.o: src/common/VectorOps.h src/common/Allocators.h +src/faster/StretcherProcess.o: src/common/FFT.h src/common/RingBuffer.h +src/faster/StretcherProcess.o: src/common/Scavenger.h src/common/Thread.h +src/faster/StretcherProcess.o: src/common/Thread.h src/common/sysutils.h +src/faster/StretcherProcess.o: src/faster/SincWindow.h src/common/VectorOps.h +src/faster/StretcherProcess.o: src/common/Allocators.h +src/faster/StretcherProcess.o: src/faster/CompoundAudioCurve.h +src/faster/StretcherProcess.o: src/faster/PercussiveAudioCurve.h +src/faster/StretcherProcess.o: src/faster/AudioCurveCalculator.h +src/faster/StretcherProcess.o: src/faster/HighFrequencyAudioCurve.h +src/faster/StretcherProcess.o: src/common/SampleFilter.h +src/faster/StretcherProcess.o: src/faster/StretcherChannelData.h +src/faster/StretcherProcess.o: src/common/StretchCalculator.h +src/faster/StretcherProcess.o: src/common/Resampler.h src/common/Profiler.h +src/faster/StretcherProcess.o: src/common/mathmisc.h +src/common/Profiler.o: src/common/Profiler.h src/common/sysutils.h +src/common/Profiler.o: src/common/Thread.h +src/common/Resampler.o: src/common/Resampler.h src/common/sysutils.h +src/common/Resampler.o: src/common/Allocators.h src/common/VectorOps.h +src/common/FFT.o: src/common/FFT.h src/common/sysutils.h src/common/Thread.h +src/common/FFT.o: src/common/Profiler.h src/common/Allocators.h +src/common/FFT.o: src/common/VectorOps.h src/common/VectorOpsComplex.h +src/common/Allocators.o: src/common/Allocators.h src/common/VectorOps.h +src/common/Allocators.o: src/common/sysutils.h +src/common/StretchCalculator.o: src/common/StretchCalculator.h +src/common/StretchCalculator.o: src/common/sysutils.h +src/common/sysutils.o: src/common/sysutils.h +src/common/Thread.o: src/common/Thread.h +src/finer/R3StretcherImpl.o: src/finer/R3StretcherImpl.h +src/finer/R3StretcherImpl.o: src/finer/BinSegmenter.h +src/finer/R3StretcherImpl.o: src/finer/BinClassifier.h +src/finer/R3StretcherImpl.o: src/common/Allocators.h +src/finer/R3StretcherImpl.o: src/common/MovingMedian.h +src/finer/R3StretcherImpl.o: src/common/SampleFilter.h +src/finer/R3StretcherImpl.o: src/common/FixedVector.h src/common/Allocators.h +src/finer/R3StretcherImpl.o: src/common/VectorOps.h src/common/sysutils.h +src/finer/R3StretcherImpl.o: src/common/SingleThreadRingBuffer.h +src/finer/R3StretcherImpl.o: src/common/RingBuffer.h +src/finer/R3StretcherImpl.o: src/common/HistogramFilter.h +src/finer/R3StretcherImpl.o: src/common/mathmisc.h src/finer/Guide.h +src/finer/R3StretcherImpl.o: src/finer/Peak.h src/finer/PhaseAdvance.h +src/finer/R3StretcherImpl.o: src/common/StretchCalculator.h +src/finer/R3StretcherImpl.o: src/common/Resampler.h src/common/FFT.h +src/finer/R3StretcherImpl.o: src/common/FixedVector.h src/common/Window.h +src/finer/R3StretcherImpl.o: rubberband/RubberBandStretcher.h +src/finer/R3StretcherImpl.o: src/common/VectorOpsComplex.h diff --git a/rubberband/RubberBandStretcher.h b/rubberband/RubberBandStretcher.h index de4149a..ef81286 100644 --- a/rubberband/RubberBandStretcher.h +++ b/rubberband/RubberBandStretcher.h @@ -24,9 +24,9 @@ #ifndef RUBBERBAND_STRETCHER_H #define RUBBERBAND_STRETCHER_H -#define RUBBERBAND_VERSION "2.0.2" +#define RUBBERBAND_VERSION "3.0.0" #define RUBBERBAND_API_MAJOR_VERSION 2 -#define RUBBERBAND_API_MINOR_VERSION 6 +#define RUBBERBAND_API_MINOR_VERSION 7 #undef RUBBERBAND_DLLEXPORT #ifdef _MSC_VER diff --git a/rubberband/rubberband-c.h b/rubberband/rubberband-c.h index 5172c26..521a531 100644 --- a/rubberband/rubberband-c.h +++ b/rubberband/rubberband-c.h @@ -28,9 +28,9 @@ extern "C" { #endif -#define RUBBERBAND_VERSION "2.0.2" +#define RUBBERBAND_VERSION "3.0.0" #define RUBBERBAND_API_MAJOR_VERSION 2 -#define RUBBERBAND_API_MINOR_VERSION 6 +#define RUBBERBAND_API_MINOR_VERSION 7 #undef RB_EXTERN #ifdef _MSC_VER diff --git a/src/finer/R3StretcherImpl.h b/src/finer/R3StretcherImpl.h index e20794a..635607d 100644 --- a/src/finer/R3StretcherImpl.h +++ b/src/finer/R3StretcherImpl.h @@ -36,7 +36,7 @@ #include "../common/Allocators.h" #include "../common/Window.h" -#include "../rubberband/RubberBandStretcher.h" +#include "../../rubberband/RubberBandStretcher.h" #include #include