]> git.tdb.fi Git - libs/core.git/commitdiff
Add decorations for things which are considered part of the API
authorMikko Rasa <tdb@tdb.fi>
Tue, 3 Jan 2023 00:23:57 +0000 (02:23 +0200)
committerMikko Rasa <tdb@tdb.fi>
Tue, 3 Jan 2023 14:31:19 +0000 (16:31 +0200)
74 files changed:
source/core/android/main.cpp
source/core/application.h
source/core/environ.h
source/core/except.h
source/core/getopt.h
source/core/maputils.h
source/core/module.h
source/core/mspcore_api.h [new file with mode: 0644]
source/core/mutex.h
source/core/noncopyable.h
source/core/osx/main.cpp
source/core/process.h
source/core/semaphore.h
source/core/systemerror.h
source/core/thread.h
source/core/unix/main.cpp
source/core/variant.h
source/core/windows/main.cpp
source/debug/backtrace.h
source/debug/debugapi.h
source/debug/demangle.h
source/debug/errorreporter.h
source/debug/exceptiontrace.h
source/debug/profiler.h
source/debug/profilingscope.h
source/fs/dir.h
source/fs/filemonitor.h
source/fs/path.h
source/fs/redirectedpath.h
source/fs/stat.h
source/fs/utils.h
source/io/asset.h
source/io/base.h
source/io/buffered.h
source/io/console.h
source/io/eventdispatcher.h
source/io/eventobject.h
source/io/file.h
source/io/handle.h
source/io/memory.h
source/io/mode.h
source/io/pipe.h
source/io/poll.h
source/io/seekable.h
source/io/serial.h
source/io/slice.h
source/io/utils.h
source/io/zlibcompressed.h
source/stringcodec/ascii.h
source/stringcodec/codec.h
source/stringcodec/codecutils.h
source/stringcodec/except.h
source/stringcodec/iso2022jp.h
source/stringcodec/iso646fi.h
source/stringcodec/iso88591.h
source/stringcodec/iso885915.h
source/stringcodec/jisx0201.h
source/stringcodec/jisx0208.h
source/stringcodec/utf16.h
source/stringcodec/utf8.h
source/stringcodec/windows1252.h
source/strings/fmt.h
source/strings/format.h
source/strings/glob.h
source/strings/lexicalcast.h
source/strings/regex.h
source/strings/regmatch.h
source/strings/utils.h
source/time/datetime.h
source/time/timedelta.h
source/time/timer.h
source/time/timestamp.h
source/time/timezone.h
source/time/utils.h

index ff811c19dd4172ba51c98953b76f1976bb3cc8ac..d6ad41525820c20acc283301d309e889bbea1a3e 100644 (file)
@@ -1,6 +1,7 @@
 #include "mainthread.h"
+#include "mspcore_api.h"
 
-extern "C" void ANativeActivity_onCreate(ANativeActivity *activity, void * /*saved_state*/, size_t /*state_size*/)
+extern "C" MSPCORE_API void ANativeActivity_onCreate(ANativeActivity *activity, void * /*saved_state*/, size_t /*state_size*/)
 {
        static Msp::Android::MainThread *thread = nullptr;
        if(thread)
index 972f3b73b1f8d9767e1f72bcd4ccdf6529415a47..2a1cc05b1cc8b5d9b8a37cf6f061c782df43e8da 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <stdexcept>
 #include <string>
+#include "mspcore_api.h"
 #include "noncopyable.h"
 
 namespace Msp {
@@ -10,10 +11,10 @@ namespace Msp {
 /**
 Base class for applications.  See also RegisteredApplication.
 */
-class Application: private NonCopyable
+class MSPCORE_API Application: private NonCopyable
 {
 protected:
-       class Starter
+       class MSPCORE_API Starter
        {
        protected:
                Starter();
index 67fde05881651f467a87fbb4481f167ffea5aa55..7fbca16a126b406d68a9ffb9f6775a12caf0d943 100644 (file)
@@ -2,12 +2,13 @@
 #define ENVIRON_H_
 
 #include <string>
+#include "mspcore_api.h"
 
 namespace Msp {
 
-std::string getenv(const std::string &);
-void setenv(const std::string &, const std::string &);
-void unsetenv(const std::string &);
+MSPCORE_API std::string getenv(const std::string &);
+MSPCORE_API void setenv(const std::string &, const std::string &);
+MSPCORE_API void unsetenv(const std::string &);
 
 } // namespace Msp
 
index 65d9ef9d88b398fe2579a0d15ba11d8a2f4bfcbc..1673ff46a4c528764988bb7520cf0a5a9f0ef6d8 100644 (file)
@@ -2,31 +2,32 @@
 #define MSP_CORE_EXCEPT_H_
 
 #include <stdexcept>
+#include "mspcore_api.h"
 
 namespace Msp {
 
-class invalid_state: public std::logic_error
+class MSPCORE_API invalid_state: public std::logic_error
 {
 public:
        invalid_state(const std::string &w): logic_error(w) { }
 };
 
 
-class already_called: public invalid_state
+class MSPCORE_API already_called: public invalid_state
 {
 public:
        already_called(const std::string &w): invalid_state(w) { }
 };
 
 
-class unsupported: public std::logic_error
+class MSPCORE_API unsupported: public std::logic_error
 {
 public:
        unsupported(const std::string &w): logic_error(w) { }
 };
 
 
-class internal_error: public std::logic_error
+class MSPCORE_API internal_error: public std::logic_error
 {
 public:
        internal_error(const std::string &w): logic_error(w) { }
index cdf5ee3a7e9706137d5c928674fdcfa278a4a0b5..59c810c5e4a5ff4182cd42d9736f8af9d708eae9 100644 (file)
@@ -6,11 +6,12 @@
 #include <string>
 #include <vector>
 #include <msp/strings/lexicalcast.h>
+#include "mspcore_api.h"
 #include "noncopyable.h"
 
 namespace Msp {
 
-class usage_error: public std::runtime_error
+class MSPCORE_API usage_error: public std::runtime_error
 {
 private:
        std::string m_help;
@@ -58,7 +59,7 @@ A built-in --help option is provided and will output a list of options,
 arguments and their associated help texts.  An application may override this by
 providing its own option with the same name.
 */
-class GetOpt: private NonCopyable
+class MSPCORE_API GetOpt: private NonCopyable
 {
 public:
        enum ArgType
@@ -68,7 +69,7 @@ public:
                REQUIRED_ARG
        };
 
-       class Option
+       class MSPCORE_API Option
        {
        protected:
                Option() = default;
@@ -88,7 +89,7 @@ public:
                virtual unsigned get_seen_count() const = 0;
        };
 
-       class Argument
+       class MSPCORE_API Argument
        {
        protected:
                Argument() = default;
index 26b72cc29e7b1891e96e06552ebb67645f679ebb..9a72d4d30f30e0339bec305b5589dc14e73be9d1 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdexcept>
 #include <typeinfo>
 #include <msp/strings/lexicalcast.h>
+#include "mspcore_api.h"
 
 namespace Msp {
 
@@ -39,7 +40,7 @@ static std::string stringify_key(const T &k)
 
 } // namespace Internal
 
-class key_error: public std::runtime_error
+class MSPCORE_API key_error: public std::runtime_error
 {
 public:
        template<typename T>
index 4b1e3e8dd983b6e306418c299d5d78b633ee187a..64d761f363eb426b3c7c28a7e13f888617874f94 100644 (file)
@@ -2,11 +2,12 @@
 #define MSP_CORE_MODULE_H_
 
 #include <string>
+#include "mspcore_api.h"
 #include "noncopyable.h"
 
 namespace Msp {
 
-class Module: private NonCopyable
+class MSPCORE_API Module: private NonCopyable
 {
 private:
        struct Private;
diff --git a/source/core/mspcore_api.h b/source/core/mspcore_api.h
new file mode 100644 (file)
index 0000000..eed6bcc
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef MSP_CORE_API_H_
+#define MSP_CORE_API_H_
+
+#if defined(_WIN32)
+#if defined(MSPCORE_BUILD)
+#define MSPCORE_API __declspec(dllexport)
+#elif defined(MSPCORE_IMPORT)
+#define MSPCORE_API __declspec(dllimport)
+#else
+#define MSPCORE_API
+#endif
+#elif defined(__GNUC__)
+#define MSPCORE_API __attribute__((visibility("default")))
+#else
+#define MSPCORE_API
+#endif
+
+#endif
index 6582074e182c988c3d813671b3cb92668c27ceeb..a48f58c89d3de88831047dd27c51aa13dec7c91a 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_CORE_MUTEX_H_
 #define MSP_CORE_MUTEX_H_
 
+#include "mspcore_api.h"
 #include "noncopyable.h"
 #include "refptr.h"
 
@@ -10,7 +11,7 @@ namespace Msp {
 A class for controlling mutually exclusive access to a resource.  Only one
 thread can hold a lock on the mutex at a time.
 */
-class Mutex: private NonCopyable
+class MSPCORE_API Mutex: private NonCopyable
 {
        friend class Semaphore;
 
@@ -38,7 +39,7 @@ public:
 /**
 Locks the mutex for the lifetime of the object.
 */
-class MutexLock
+class MSPCORE_API MutexLock
 {
 private:
        Mutex &mutex;
index c948c57c7ab6b21e29e6f8036d7ff0f374bf21bd..78f9e66c24d1ee15fc89f118c52bde404738eef0 100644 (file)
@@ -1,9 +1,11 @@
 #ifndef MSP_CORE_NONCOPYABLE_H_
 #define MSP_CORE_NONCOPYABLE_H_
 
+#include "mspcore_api.h"
+
 namespace Msp {
 
-class NonCopyable
+class MSPCORE_API NonCopyable
 {
 protected:
        NonCopyable() = default;
index 4bb81c83c41c4380857e6f0d7b49497bb2fae65b..55d4a304ce08b1f91bef2fe9fce2b12146c41e4a 100644 (file)
@@ -1,7 +1,8 @@
 #include <cstring>
 #include "application.h"
+#include "mspcore_api.h"
 
-int main(int argc, char **argv)
+MSPCORE_API int main(int argc, char **argv)
 {
        void *data = nullptr;
 
index 0d7faa6c82f96c0e1eb413e582eab6c5a10ff4f4..ed997f853e143a52bbfd386cda1e32115c937255 100644 (file)
@@ -5,6 +5,7 @@
 #include <vector>
 #include <msp/fs/path.h>
 #include <msp/io/base.h>
+#include "mspcore_api.h"
 #include "noncopyable.h"
 
 namespace Msp {
@@ -22,7 +23,7 @@ the process or capture its output, use an IO::Pipe.  Redirections performed on
 the self object take effect immediately.  It is recommended to perform such
 redirections directly on the Console objects.
 */
-class Process: private NonCopyable
+class MSPCORE_API Process: private NonCopyable
 {
 public:
        typedef std::vector<std::string> Arguments;
index 28c3b3d72cb8f009fd4474cfa73ab586db1a1d02..f5042892a1825bf1650f16e8ad93f833790f90a3 100644 (file)
@@ -2,11 +2,12 @@
 #define MSP_CORE_SEMAPHORE_H_
 
 #include <msp/time/timedelta.h>
+#include "mspcore_api.h"
 #include "noncopyable.h"
 
 namespace Msp {
 
-class Semaphore: private NonCopyable
+class MSPCORE_API Semaphore: private NonCopyable
 {
 private:
        struct Private;
index 5edbe9d5062d938e95bc7a9832fe5eea347ad5bc..cce3c5c7e6ad4f8662171d6adf735d841f574f72 100644 (file)
@@ -3,10 +3,11 @@
 
 #include <stdexcept>
 #include <string>
+#include "mspcore_api.h"
 
 namespace Msp {
 
-class system_error: public std::runtime_error
+class MSPCORE_API system_error: public std::runtime_error
 {
 private:
        int m_code;
index ef071cd43ffb070f8c2ea2646a514ac2f514f9a6..71acb22079f749520e86b8939965483218fdb773 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_CORE_THREAD_H_
 
 #include <string>
+#include "mspcore_api.h"
 #include "noncopyable.h"
 
 namespace Msp {
@@ -13,7 +14,7 @@ automatically started upon creation - you must manually call launch() instead.
 This is to allow initializing variables of the derived class before the thread
 is started.
 */
-class Thread: private NonCopyable
+class MSPCORE_API Thread: private NonCopyable
 {
 private:
        struct Private;
index 58c9fda45e812e362d9f0d18d29568db387cf068..010459f55aab1d4bb5c4e24b805520784fe2fbb8 100644 (file)
@@ -1,6 +1,7 @@
 #include "application.h"
+#include "mspcore_api.h"
 
-int main(int argc, char **argv)
+MSPCORE_API int main(int argc, char **argv)
 {
        return Msp::Application::run(argc, argv, nullptr);
 }
index 5de5a726f2dde80ee987c582851bbac2ca0523e6..c0b0aebc3e901171fd9b60af95c8fe5826fd33d3 100644 (file)
@@ -5,17 +5,18 @@
 #include <type_traits>
 #include <typeinfo>
 #include "meta.h"
+#include "mspcore_api.h"
 
 namespace Msp {
 
-class type_mismatch: public std::runtime_error
+class MSPCORE_API type_mismatch: public std::runtime_error
 {
 public:
        type_mismatch(const std::type_info &, const std::type_info &);
 };
 
 
-class Variant
+class MSPCORE_API Variant
 {
 public:
        static constexpr unsigned INTERNAL_SIZE = 2*sizeof(void *);
index 11df925692c55d50bdabc5d6d52a5e072e8cbdde..11da64b8a3dc61d427e952ba7c897162f945989f 100644 (file)
@@ -2,11 +2,12 @@
 #include <msp/stringcodec/utf16.h>
 #include <msp/stringcodec/utf8.h>
 #include "application.h"
+#include "mspcore_api.h"
 
 using namespace std;
 using namespace Msp;
 
-int main(int argc, char **argv)
+MSPCORE_API int main(int argc, char **argv)
 {
        return Msp::Application::run(argc, argv);
 }
index 98aa4d8cdd9736291253cecf403b10d75bf43b2a..b8e06af27b9c400d1e6f3b741627a0e6e716ee04 100644 (file)
@@ -4,11 +4,12 @@
 #include <ostream>
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace Debug {
 
-class Backtrace
+class MSPCORE_API Backtrace
 {
 public:
        struct StackFrame
@@ -27,8 +28,8 @@ public:
        static Backtrace create();
 };
 
-std::ostream &operator<<(std::ostream &, const Backtrace &);
-std::ostream &operator<<(std::ostream &, const Backtrace::StackFrame &);
+MSPCORE_API std::ostream &operator<<(std::ostream &, const Backtrace &);
+MSPCORE_API std::ostream &operator<<(std::ostream &, const Backtrace::StackFrame &);
 
 } // namespace Debug
 } // namespace Msp
index 80dcc4cdff330b210d291009435c4a77d08a3755..0f1a5013300619e1c2d99869b9b50aafbe823622 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef MSP_DEBUG_DEBUGAPI_H_
 #define MSP_DEBUG_DEBUGAPI_H_
 
+#include <msp/core/mspcore_api.h>
+
 namespace Msp {
 namespace Debug {
 
@@ -11,8 +13,8 @@ enum DebuggerType
        UNKNOWN,
 };
 
-DebuggerType check_debugger(bool = false);
-void debug_break();
+MSPCORE_API DebuggerType check_debugger(bool = false);
+MSPCORE_API void debug_break();
 
 } // namespace Debug
 } // namespace Msp
index 213a348f5f2d280d22277ab3cfb91af50f121746..22334354034759f78344dbc3bf5543e3ef1af006 100644 (file)
@@ -2,11 +2,12 @@
 #define MSP_DEBUG_DEMANGLE_H_
 
 #include <string>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace Debug {
 
-std::string demangle(const std::string &);
+MSPCORE_API std::string demangle(const std::string &);
 
 } // namespace Debug
 } // namespace Msp
index 9a60f85c0f41b8bbdc4244734302e0c47fabe1c3..ce14c637a1d74d5870e5fa2708a58ce85c940497 100644 (file)
@@ -2,12 +2,13 @@
 #define MSP_DEBUG_ERRORREPORTER_H_
 
 #include <stdexcept>
+#include <msp/core/mspcore_api.h>
 #include <msp/core/noncopyable.h>
 
 namespace Msp {
 namespace Debug {
 
-class ErrorReporter: private NonCopyable
+class MSPCORE_API ErrorReporter: private NonCopyable
 {
 private:
        ErrorReporter *_prev = nullptr;
index 52664b6dbdd082731d9c681bc48b7e3cdecba471..0786c780013aa3a8447b857ce7c7c69dc2543a75 100644 (file)
@@ -1,13 +1,15 @@
 #ifndef MSP_DEBUG_EXCEPTIONTRACE_H_
 #define MSP_DEBUG_EXCEPTIONTRACE_H_
 
+#include <msp/core/mspcore_api.h>
+
 namespace Msp {
 namespace Debug {
 
 class Backtrace;
 
-void enable_exception_trace(bool);
-const Backtrace &get_exception_trace();
+MSPCORE_API void enable_exception_trace(bool);
+MSPCORE_API const Backtrace &get_exception_trace();
 
 } // namespace Debug
 } // namespace Msp
index 22d2c9a82c9fcb7df8545d16e7545d9ebb0720a3..7d98dc7556e7316fe3e69257877a4ba8c8c6a018 100644 (file)
@@ -4,6 +4,7 @@
 #include <map>
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 #include <msp/core/noncopyable.h>
 #include <msp/time/timedelta.h>
 #include <msp/time/timestamp.h>
@@ -25,16 +26,16 @@ profiled.
 Note: This is not thread-safe.  To profile multiple threads, create a separate
 Profiler for each thread.
 */
-class Profiler: private NonCopyable
+class MSPCORE_API Profiler: private NonCopyable
 {
 public:
-       struct CallInfo
+       struct MSPCORE_API CallInfo
        {
                Msp::Time::TimeStamp entry_time;
                Msp::Time::TimeDelta duration;
        };
 
-       struct ScopeInfo
+       struct MSPCORE_API ScopeInfo
        {
                Time::TimeStamp first_call;
                unsigned calls = 0;
index 586efa31d53fbf062a175ae7a44fb1e31897ac3f..7b8bcf375108c5a42ff80f98780571c2ab2bfda5 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_DEBUG_PROFILINGSCOPE_H_
 #define MSP_DEBUG_PROFILINGSCOPE_H_
 
+#include <msp/core/mspcore_api.h>
 #include <msp/core/noncopyable.h>
 #include <msp/time/timestamp.h>
 #include "profiler.h"
@@ -13,7 +14,7 @@ RAII timing class to accompany Profiler.  Timing starts when an object is
 created and ends when it goes out of scope.  If there was another object in an
 outer scope, it is notified of the time used in inner scopes.
 */
-class ProfilingScope: private NonCopyable
+class MSPCORE_API ProfilingScope: private NonCopyable
 {
 private:
        Profiler &profiler;
index bef89c6d72e1e160072be098450c8641bb0ec00a..960be2e00c0559e258c6f2edbd7e3863e3f6cb84 100644 (file)
@@ -4,12 +4,13 @@
 #include <stdexcept>
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 #include "path.h"
 
 namespace Msp {
 namespace FS {
 
-class not_a_directory: public std::runtime_error
+class MSPCORE_API not_a_directory: public std::runtime_error
 {
 public:
        not_a_directory(const Path &);
@@ -17,50 +18,50 @@ public:
 };
 
 /// Creates a directory
-void mkdir(const Path &path, int mode);
+MSPCORE_API void mkdir(const Path &path, int mode);
 
 /// Creates a directory and any required parent directories
-void mkpath(const Path &path, int mode);
+MSPCORE_API void mkpath(const Path &path, int mode);
 
 /// Removes a directory, which must be empty
-void rmdir(const Path &path);
+MSPCORE_API void rmdir(const Path &path);
 
 /// Removes a directory and anything it contains
-void rmpath(const Path &path);
+MSPCORE_API void rmpath(const Path &path);
 
 /// Lists the contents of a directory
-std::vector<std::string> list_files(const Path &path);
+MSPCORE_API std::vector<std::string> list_files(const Path &path);
 
 /// Lists the contents of a directory, filtered with a regex
-std::vector<std::string> list_filtered(const Path &path, const std::string &filter);
+MSPCORE_API std::vector<std::string> list_filtered(const Path &path, const std::string &filter);
 
 /// Returns the current working directory
-Path getcwd();
+MSPCORE_API Path getcwd();
 
 /// Changes the current working directory
-void chdir(const Path &);
+MSPCORE_API void chdir(const Path &);
 
 /// Returns the user's home directory
-Path get_home_dir();
+MSPCORE_API Path get_home_dir();
 
 /// Returns a directory suitable for storing user-specific data.
-Path get_user_data_dir();
+MSPCORE_API Path get_user_data_dir();
 
 /// Returns a directory containing system-wide configuration.
-Path get_sys_conf_dir();
+MSPCORE_API Path get_sys_conf_dir();
 
 /// Returns a directory containing immutable system-wide data.
-Path get_sys_data_dir();
+MSPCORE_API Path get_sys_data_dir();
 
 /// Returns a directory containing system-wide architecture-specific files.
-Path get_sys_lib_dir();
+MSPCORE_API Path get_sys_lib_dir();
 
 /** Looks for a file in a list of paths.  Returns the absolute path to the
 first existing location, or an empty Path if the file is not found at all. */
-Path path_lookup(const std::string &, const std::vector<Path> &);
+MSPCORE_API Path path_lookup(const std::string &, const std::vector<Path> &);
 
 /** Looks for a file using the PATH environment variable. */
-Path path_lookup(const std::string &);
+MSPCORE_API Path path_lookup(const std::string &);
 
 } // namespace FS
 } // namespace Msp
index 220b9697594178d0ad73489d662b08a88d8d77bf..3ce5d79db2dc991ac562e0bb30f44df5cf11dee7 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef FILEMONITOR_H_
 #define FILEMONITOR_H_
 
+#include <msp/core/mspcore_api.h>
 #include <msp/core/noncopyable.h>
 #include <msp/fs/path.h>
 #include <msp/io/eventdispatcher.h>
@@ -8,7 +9,7 @@
 namespace Msp {
 namespace FS {
 
-class FileMonitor: NonCopyable
+class MSPCORE_API FileMonitor: NonCopyable
 {
 private:
        struct Private;
index 30fe683eabafff9f64b8841f8706ea4cde8be341..1b15047cc528ece01f9d2061fcd0fd3740dedfef 100644 (file)
@@ -4,6 +4,7 @@
 #include <ostream>
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace FS {
@@ -28,13 +29,13 @@ A path can also be treated as an array of components, supporting indexing,
 iteration and slicing.  In this context the root directory is treated as a
 component of its own.
 */
-class Path
+class MSPCORE_API Path
 {
 private:
        typedef std::vector<std::string::size_type> PositionArray;
 
 public:
-       class Iterator
+       class MSPCORE_API Iterator
        {
        public:
                typedef PositionArray::difference_type difference_type;
index 50a3609bd36eb7e163826707ddf7a0bc50c0a0df..95888f7ee8e9ac96c03896b48e99f98ff2395411 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_FS_REDIRECTEDPATH_H_
 #define MSP_FS_REDIRECTEDPATH_H_
 
+#include <msp/core/mspcore_api.h>
 #include "path.h"
 
 namespace Msp {
@@ -12,7 +13,7 @@ goes out of scope, it is renamed to the original path.  If destruction happens
 due to an exception, it is unlinked instead.  The primary use for this is to
 atomically overwrite a file with a new version.
 */
-class RedirectedPath: public Path
+class MSPCORE_API RedirectedPath: public Path
 {
 private:
        Path original;
index c32e8798162787b40b47a4ff41d9c7603689e806..fd6a2f75ba6092e7f72181b95b7c8fb332428fe8 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <cstdint>
 #include <string>
+#include <msp/core/mspcore_api.h>
 #include <msp/time/timestamp.h>
 #include "path.h"
 
@@ -22,7 +23,7 @@ typedef uint64_t FileSize;
 /**
 Holds file information.
 */
-class Stat
+class MSPCORE_API Stat
 {
 private:
        struct Private;
@@ -73,7 +74,7 @@ inline Stat lstat(const Path &path)
 { return Stat::lstat(path); }
 
 /// Tests for existence of a file
-bool exists(const Path &path);
+MSPCORE_API bool exists(const Path &path);
 
 /// Tests whether a path refers to an existing regular file
 inline bool is_reg(const Path &path)
index e518d35cf225da8e38692e5b09dffe2d21793af5..9c4bb5ca47fdeed1035a341d5e06e2bac54b00f8 100644 (file)
@@ -1,50 +1,51 @@
 #ifndef MSP_FS_UTILS_H_
 #define MSP_FS_UTILS_H_
 
+#include <msp/core/mspcore_api.h>
 #include "path.h"
 
 namespace Msp {
 namespace FS {
 
 /// Extracts the last component of the path.
-std::string basename(const Path &);
+MSPCORE_API std::string basename(const Path &);
 
 /// Removes the last component from the path.
-Path dirname(const Path &);
+MSPCORE_API Path dirname(const Path &);
 
 /** Returns the base part of a filename.  This includes everything up to the
 last dot, but not the dot itself. */
-std::string basepart(const std::string &);
+MSPCORE_API std::string basepart(const std::string &);
 
 /** Returns the extension part of a filename.  This includes the last dot and
 everything after it. */
-std::string extpart(const std::string &);
+MSPCORE_API std::string extpart(const std::string &);
 
 /// Fixes the case of a path to match files / directories on the filesystem.
-Path fix_case(const Path &path);
+MSPCORE_API Path fix_case(const Path &path);
 
 /// Reads the contents of a symbolic link
-Path readlink(const Path &path);
+MSPCORE_API Path readlink(const Path &path);
 
 /// Resolves all symlinks from a path.  Will always return an absolute path.
-Path realpath(const Path &path);
+MSPCORE_API Path realpath(const Path &path);
 
 /// Removes a file
-void unlink(const Path &path);
+MSPCORE_API void unlink(const Path &path);
 
 /// Renames a file.  Existing file, if any, is overwritten.
-void rename(const Path &from, const Path &to);
+MSPCORE_API void rename(const Path &from, const Path &to);
 
 /** Makes a path relative to some base path.  That is, base/result==path.  Both
 paths must be either absolute or relative. */
-Path relative(const Path &path, const Path &base);
+MSPCORE_API Path relative(const Path &path, const Path &base);
 
 /// Returns the longest prefix shared by both paths.
-Path common_ancestor(const Path &, const Path &);
+MSPCORE_API Path common_ancestor(const Path &, const Path &);
 
 /** Determines how many levels a path is below another.  Returns -1 if path is
 not a descendant of parent.  Both paths must be either absolute or relative. */
-int descendant_depth(const Path &path, const Path &parent);
+MSPCORE_API int descendant_depth(const Path &path, const Path &parent);
 
 } // namespace FS
 } // namespace Msp
index 84c2837656f4e8f05d2684e414b824e0e8e39047..41cf10ddc2dc44b8d5eb3aff934f65b8b617bbf2 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_ASSET_H_
 #define MSP_IO_ASSET_H_
 
+#include <msp/core/mspcore_api.h>
 #include "seekable.h"
 
 namespace Msp {
@@ -11,7 +12,7 @@ Opens a file from the application's assets.  On Android, this means the assets
 contained within the APK.  On other platfoms, assets are located in the
 directory indicated by FS::get_sys_data_dir().  Assets are always read-only.
 */
-class Asset: public Seekable
+class MSPCORE_API Asset: public Seekable
 {
 private:
        struct Private;
index aadc6acd48db7c49430e4823c74423a354168535..92c860d266f1923d275c6f568ef99c4a0e715863 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <cstddef>
 #include <sigc++/sigc++.h>
+#include <msp/core/mspcore_api.h>
 #include <msp/core/mutex.h>
 #include <msp/core/noncopyable.h>
 #include "handle.h"
@@ -15,7 +16,7 @@ namespace IO {
 /**
 Common interface for all I/O objects.
 */
-class Base: private NonCopyable
+class MSPCORE_API Base: private NonCopyable
 {
 public:
        /** RAII synchronization primitive.  Prevents concurrent access to the
index 07b5d37e39e1ce4e9eb005f4358e70a40bcc4715..c05fc25eed5ad9454448d34f60a716ed091d56cb 100644 (file)
@@ -2,12 +2,13 @@
 #define MSP_IO_BUFFERED_H_
 
 #include <sigc++/trackable.h>
+#include <msp/core/mspcore_api.h>
 #include "base.h"
 
 namespace Msp {
 namespace IO {
 
-class Buffered: public Base, public sigc::trackable
+class MSPCORE_API Buffered: public Base, public sigc::trackable
 {
 private:
        Base &below;
index ac66288832966bd4bf67355519ce2bed5d43170a..1755659f9f5b3c0d7e93d3670decf4157d034fdb 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_CONSOLE_H_
 #define MSP_IO_CONSOLE_H_
 
+#include <msp/core/mspcore_api.h>
 #include "eventobject.h"
 #include "handle.h"
 
@@ -12,7 +13,7 @@ Provides access to standard input, output and error streams.  This class can't
 be instantiated directly - use one of the cin, cout and cerr references
 instead.
 */
-class Console: public EventObject
+class MSPCORE_API Console: public EventObject
 {
 public:
        enum Stream
@@ -64,9 +65,9 @@ public:
        static Console &instance(Stream);
 };
 
-extern Console &cin;
-extern Console &cout;
-extern Console &cerr;
+MSPCORE_API extern Console &cin;
+MSPCORE_API extern Console &cout;
+MSPCORE_API extern Console &cerr;
 
 } // namespace IO
 } // namespace Msp
index d9a7afd2a02cfe3809578d89821d9c03541fe804..25341bfe36fd04bc28878c0a8971bfce62de689e 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <set>
 #include <sigc++/trackable.h>
+#include <msp/core/mspcore_api.h>
 #include <msp/time/timedelta.h>
 #include <msp/time/timer.h>
 #include "poll.h"
@@ -14,7 +15,7 @@ namespace IO {
 Put your I/O objects inside one of these to get signaled when something happens
 on some of them.
 */
-class EventDispatcher
+class MSPCORE_API EventDispatcher
 {
 private:
        struct Slot: public sigc::trackable
index cf987e4094fae6ce133c0f7c4f00491eb7e381df..75cfb73692c3b164ab821f765348dec337b5d699 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_EVENTOBJECT_H_
 #define MSP_IO_EVENTOBJECT_H_
 
+#include <msp/core/mspcore_api.h>
 #include "base.h"
 
 namespace Msp {
@@ -13,7 +14,7 @@ Interface class for objects that can provide event-based I/O.  These objects
 can be fed to the various poll functions in poll.h, or added to an
 EventDispatcher to generate event signals.
 */
-class EventObject: public Base
+class MSPCORE_API EventObject: public Base
 {
 public:
        /** Emitted when there is data available for reading.  If all data is not
index 106813144615f6767d1e1247432903505154ec48..2af56ae67b2264913dcc3fa376ba5cde023c63b5 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <stdexcept>
 #include <string>
+#include <msp/core/mspcore_api.h>
 #include "buffered.h"
 #include "handle.h"
 #include "seekable.h"
 namespace Msp {
 namespace IO {
 
-class file_not_found: public std::runtime_error
+class MSPCORE_API file_not_found: public std::runtime_error
 {
 public:
        file_not_found(const std::string &fn): std::runtime_error(fn) { }
 };
 
-class file_already_exists: public std::runtime_error
+class MSPCORE_API file_already_exists: public std::runtime_error
 {
 public:
        file_already_exists(const std::string &fn): std::runtime_error(fn) { }
@@ -28,7 +29,7 @@ A class for reading and writing files.
 
 Non-blocking mode is not supported on Win32.
 */
-class File: public Seekable
+class MSPCORE_API File: public Seekable
 {
 public:
        enum CreateMode
@@ -80,7 +81,7 @@ inline File::CreateMode operator~(File::CreateMode m)
 { return File::CreateMode(~static_cast<int>(m)); }
 
 
-class BufferedFile: public Seekable
+class MSPCORE_API BufferedFile: public Seekable
 {
 private:
        File file;
index 6140e116d74fb497d83085d921e11b515084616a..06c2034c5271995995fd2929027cc1951fcf9d7d 100644 (file)
@@ -2,11 +2,12 @@
 #define MSP_IO_HANDLE_H_
 
 #include <cstddef>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace IO {
 
-class Handle
+class MSPCORE_API Handle
 {
 public:
        struct Private;
index 75cf7f5a6056ff052ebef19b4622692f6bf138d5..5ae2a34fe43fe6c72c490f20148f0ef992ab7f30 100644 (file)
@@ -1,12 +1,13 @@
 #ifndef MSP_IO_MEMORY_H_
 #define MSP_IO_MEMORY_H_
 
+#include <msp/core/mspcore_api.h>
 #include "seekable.h"
 
 namespace Msp {
 namespace IO {
 
-class Memory: public Seekable
+class MSPCORE_API Memory: public Seekable
 {
 private:
        char *begin = nullptr;
index 65b408972b4cd6d01f2b140a541bae71e87c19a8..6230a6560936962c16ae448e888c9313b9e1890a 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_IO_MODE_H_
 
 #include <stdexcept>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace IO {
@@ -30,7 +31,7 @@ inline void adjust_mode(Mode &m, Mode f, bool b)
 { m = b ? (m|f) : (m&~f); }
 
 
-class invalid_access: public std::logic_error
+class MSPCORE_API invalid_access: public std::logic_error
 {
 public:
        invalid_access(Mode);
index df5353a39eb078c6fc3eab7f6509a441b28cdd69..c62aa361b6dc1c349aca224f44b5ddf8b75d9ec5 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_PIPE_H_
 #define MSP_IO_PIPE_H_
 
+#include <msp/core/mspcore_api.h>
 #include "eventobject.h"
 #include "eventreader.h"
 #include "handle.h"
@@ -8,7 +9,7 @@
 namespace Msp {
 namespace IO {
 
-class Pipe: public EventObject
+class MSPCORE_API Pipe: public EventObject
 {
 private:
        Handle read_handle;
index 4466ca33e17c59772ba97a805c41eef238822248..53e3808feceb4a00845e5a9ec63d0ae5918d8544 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <map>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 #include <msp/core/noncopyable.h>
 #include <msp/time/timedelta.h>
 
@@ -31,7 +32,7 @@ inline PollEvent operator~(PollEvent e)
 { return PollEvent(~static_cast<int>(e)); }
 
 
-class Poller: private NonCopyable
+class MSPCORE_API Poller: private NonCopyable
 {
 public:
        struct PolledObject
@@ -64,8 +65,8 @@ public:
        const std::vector<PolledObject> &get_result() const { return poll_result; }
 };
 
-PollEvent poll(EventObject &, PollEvent);
-PollEvent poll(EventObject &, PollEvent, const Time::TimeDelta &);
+MSPCORE_API PollEvent poll(EventObject &, PollEvent);
+MSPCORE_API PollEvent poll(EventObject &, PollEvent, const Time::TimeDelta &);
 
 } // namespace IO
 } // namespace Msp
index 84a556163e764e40ed837703434a01dfd60fe9a9..e549d24c5dd7b8a0527b4cb9fc4e039ce887ad91 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <cstdint>
 #include <stdexcept>
+#include <msp/core/mspcore_api.h>
 #include "base.h"
 
 namespace Msp {
@@ -20,7 +21,7 @@ enum SeekType
 };
 
 
-class bad_seek: public std::runtime_error
+class MSPCORE_API bad_seek: public std::runtime_error
 {
 public:
        bad_seek(SeekOffset, SeekType);
@@ -28,7 +29,7 @@ public:
 };
 
 
-class Seekable: public Base
+class MSPCORE_API Seekable: public Base
 {
 protected:
        Seekable() = default;
index a07cd1fd43e404b3a0e82e603abff93388bd1cc0..b83f1e5fb5cb427ac476a86b54f004ba2943ffa1 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_SERIAL_H_
 #define MSP_IO_SERIAL_H_
 
+#include <msp/core/mspcore_api.h>
 #include "eventobject.h"
 #include "eventreader.h"
 #include "handle.h"
@@ -8,7 +9,7 @@
 namespace Msp {
 namespace IO {
 
-class Serial: public EventObject
+class MSPCORE_API Serial: public EventObject
 {
 public:
        enum Parity
index 2965f9899a8252c8415b5c776e31dee8b6c490fd..272fa2c8c1b8d6191a21d123971dc162229f136d 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_IO_SLICE_H_
 #define MSP_IO_SLICE_H_
 
+#include <msp/core/mspcore_api.h>
 #include "seekable.h"
 
 namespace Msp {
@@ -16,7 +17,7 @@ its range.  If the offset of the underlying object is changed, the Slice will
 restore it before the next access.  This enables multiple Slices to be created
 on top of the same object.
 */
-class Slice: public Seekable, public sigc::trackable
+class MSPCORE_API Slice: public Seekable, public sigc::trackable
 {
 private:
        Seekable &below;
index f73383d94ba9dc29b78d17aaa0c2a1e4912afec7..4507f5c8046ca7e35b6a35a14dd990834b4fefc0 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_IO_UTILS_H_
 
 #include <cstddef>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace IO {
@@ -14,7 +15,7 @@ data is read, regardless of the blocking mode of the object.
 Note: If the data is not immediately available and the object is in non-blocking
 mode, this function effectively becomes a busyloop until it can get more
 data. */
-std::size_t read_all(Base &, char *, std::size_t);
+MSPCORE_API std::size_t read_all(Base &, char *, std::size_t);
 
 } // namespace IO
 } // namespace Msp
index 67cd6731de1f317c34a8d76abf79afd26096bdf0..1dc15697fc3e59089ac745fe16aa42a5aaff8094 100644 (file)
@@ -4,12 +4,13 @@
 #include <stdexcept>
 #include <string>
 #include <sigc++/trackable.h>
+#include <msp/core/mspcore_api.h>
 #include "base.h"
 
 namespace Msp {
 namespace IO {
 
-class zlib_error: public std::runtime_error
+class MSPCORE_API zlib_error: public std::runtime_error
 {
 private:
        int m_code;
@@ -27,7 +28,7 @@ operates on top of another I/O object.
 To ensure proper termination of the compressed data stream, the ZlibCompressed
 object must be destroyed before the underlying object is closed.
 */
-class ZlibCompressed: public Base, public sigc::trackable
+class MSPCORE_API ZlibCompressed: public Base, public sigc::trackable
 {
 private:
        struct Private;
index bb5d0eea023db4efbc9c6ca2a9d19b646699d89e..755edebce30995cd98baff4102ece87ec2f9e753 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_ASCII_H_
 #define MSP_STRINGCODEC_ASCII_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Ascii: public StandardCodec<Ascii>
+class MSPCORE_API Ascii: public StandardCodec<Ascii>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index 5e67d46049078f3555994eeca393ce9691bf75f8..f53bae5ba1d8ee86de0d469629ff21daad4b57d1 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_STRINGCODEC_CODEC_H_
 
 #include <string>
+#include <msp/core/mspcore_api.h>
 #include "except.h"
 #include "ustring.h"
 
@@ -25,7 +26,7 @@ Unicode strings are represented as ustrings.  An std::string is considered to
 be an encoded sequence of bytes.  A codec is able to determine if an encoded
 string could be decoded with it.
 */
-class Codec
+class MSPCORE_API Codec
 {
 public:
        /**
@@ -36,7 +37,7 @@ public:
        may find it useful or necessary to implement some other functions too
        (particularly sync and reset for stateful codecs).
        */
-       class Encoder
+       class MSPCORE_API Encoder
        {
        protected:
                ErrorMode err_mode = THROW_ON_ERROR;
@@ -87,7 +88,7 @@ public:
 
        Each codec class should contain an Decoder class derived from this.
        */
-       class Decoder
+       class MSPCORE_API Decoder
        {
        protected:
                ErrorMode err_mode = THROW_ON_ERROR;
@@ -204,11 +205,11 @@ std::string transcode(const std::string &s)
 
 /** Creates a codec for an encoding by name.  The caller is responsible for
 deleting the codec when it's no longer needed. */
-Codec *create_codec(const std::string &);
+MSPCORE_API Codec *create_codec(const std::string &);
 
 /** Automatically detects the encoding of a string and creates a codec for it.
 The codec must be deleted when it's no longer needed. */
-Codec *detect_codec(const std::string &);
+MSPCORE_API Codec *detect_codec(const std::string &);
 
 } // namespace StringCodec
 } // namespace Msp
index 395949e8e814e8d3e3cef04b3f097b0c4f8b029e..cf9eb2d10b2dd580507432c0fd31327e041c1c66 100644 (file)
@@ -1,10 +1,12 @@
 #ifndef MSP_STRINGCODEC_CODECUTILS_H_
 #define MSP_STRINGCODEC_CODECUTILS_H_
 
+#include <msp/core/mspcore_api.h>
+
 namespace Msp {
 namespace StringCodec {
 
-int transform_mapping_or_direct(const int *mapping, unsigned map_size, int ch, bool reverse);
+MSPCORE_API int transform_mapping_or_direct(const int *mapping, unsigned map_size, int ch, bool reverse);
 
 } // namespace StringCodec
 } // namespace Msp
index 19cb4137079783b8986bd3c41a2def2f6333264b..fc377e0a36bc269be33a500d98ae3427ba5802ef 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_STRINGCODEC_EXCEPT_H_
 
 #include <stdexcept>
+#include <msp/core/mspcore_api.h>
 #include "ustring.h"
 
 namespace Msp {
@@ -10,7 +11,7 @@ namespace StringCodec {
 /**
 Base class for codec errors.
 */
-class codec_error: public std::runtime_error
+class MSPCORE_API codec_error: public std::runtime_error
 {
 public:
        codec_error(const std::string &w): std::runtime_error(w) { }
@@ -20,7 +21,7 @@ public:
 /**
 Thrown when a codec can't encode the requested character.
 */
-class invalid_character: public codec_error
+class MSPCORE_API invalid_character: public codec_error
 {
 public:
        invalid_character(unichar, const std::string &);
@@ -30,7 +31,7 @@ public:
 /**
 Thrown when a codec encounters a byte sequence it can't decode.
 */
-class invalid_sequence: public codec_error
+class MSPCORE_API invalid_sequence: public codec_error
 {
 public:
        invalid_sequence(const std::string::const_iterator &, const std::string::const_iterator &, const std::string &);
index a9bc1c2d513d37bb20486009bb6964764836d5e4..0bb1ad3f559f220f4a5e115ab6bcaafd5ff3ba96 100644 (file)
@@ -1,12 +1,13 @@
 #ifndef MSP_STRINGCODEC_ISO2022JP_H_
 #define MSP_STRINGCODEC_ISO2022JP_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Iso2022Jp: public StandardCodec<Iso2022Jp>
+class MSPCORE_API Iso2022Jp: public StandardCodec<Iso2022Jp>
 {
 public:
        enum Mode
@@ -16,7 +17,7 @@ public:
                JISX0208
        };
 
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        private:
                Mode mode = ASCII;
@@ -32,7 +33,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        private:
                Mode mode = ASCII;
index fdb3d606229b7b073ca85898e2cf2271c2297cb1..3f1bb703da0b810df16fbd48e2a71f2b2f19cf12 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_ISO646FI_H_
 #define MSP_STRINGCODEC_ISO646FI_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Iso646Fi: public StandardCodec<Iso646Fi>
+class MSPCORE_API Iso646Fi: public StandardCodec<Iso646Fi>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index a8ba809410ee40bd6a521bdc12fba74401375542..a6003ceda3eb1986b0f892936018f9de11032b10 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_ISO88591_H_
 #define MSP_STRINGCODEC_ISO88591_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Iso88591: public StandardCodec<Iso88591>
+class MSPCORE_API Iso88591: public StandardCodec<Iso88591>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index 3791d0594cf1d52ebba9598067001f5f802f15ca..2e812459af64e77199ec437a7de2e831cff462cc 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_ISO885915_H_
 #define MSP_STRINGCODEC_ISO885915_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Iso885915: public StandardCodec<Iso885915>
+class MSPCORE_API Iso885915: public StandardCodec<Iso885915>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index 5cbda036b16f28e02440fd31b54f6efef42c08a1..3194c784c8d5378ad90213754da7cd09e42ffcdb 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_JISX201_H_
 #define MSP_STRINGCODEC_JISX201_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class JisX0201: public StandardCodec<JisX0201>
+class MSPCORE_API JisX0201: public StandardCodec<JisX0201>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index b0c03b2af8136593a2e9d26cc882c8596d20f1c9..0f29432efbfe91cb042ab8f8ff177d1174ca189e 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_STRINGCODEC_JISX0208_H_
 #define MSP_STRINGCODEC_JISX0208_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
@@ -11,10 +12,10 @@ Codec for the JIS X 0208 encoding.  This is not particularly useful as a
 stand-alone codec, due to lack of a linefeed character among other things,
 but is included as part of some other encodings.
 */
-class JisX0208: public StandardCodec<JisX0208>
+class MSPCORE_API JisX0208: public StandardCodec<JisX0208>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -24,7 +25,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
@@ -46,8 +47,8 @@ struct Kuten
        explicit operator bool() { return ku!=0 && ten!=0; }
 };
 
-unichar jisx0208_to_ucs(Kuten);
-Kuten ucs_to_jisx0208(unichar);
+MSPCORE_API unichar jisx0208_to_ucs(Kuten);
+MSPCORE_API Kuten ucs_to_jisx0208(unichar);
 
 } // namespace StringCodec
 } // namespace Msp
index 73d81cb9c26a15ec4ad9c318e4525f5a5a4a3705..a588b124dddb27461f05c4a41b31aee8a1cd783f 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_STRINGCODEC_UTF16_H_
 #define MSP_STRINGCODEC_UTF16_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
@@ -11,7 +12,7 @@ The UTF-16 codec, as specified in the Unicode standard.  Both little and big
 endian are supported, as well as autodetection with the BOM.  In the absence
 of a BOM, big endian is assumed.
 */
-class Utf16: public StandardCodec<Utf16>
+class MSPCORE_API Utf16: public StandardCodec<Utf16>
 {
 public:
        enum Endian
@@ -21,7 +22,7 @@ public:
                LITTLE
        };
 
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        private:
                Endian endian = BIG;
@@ -35,7 +36,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        private:
                Endian endian = AUTO;
index f170916f1d6c6d39ee1c1eb3d46f77df7068951e..c3f4a5930014f46c5d3a46318d2cf5c4f17ef4c6 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_UTF8_H_
 #define MSP_STRINGCODEC_UTF8_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Utf8: public StandardCodec<Utf8>
+class MSPCORE_API Utf8: public StandardCodec<Utf8>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index bcea69b7a60e6818cad0bcef0137c10228012d81..b89fdaea1646d7438eebfd52cd97bb45b91dabe5 100644 (file)
@@ -1,15 +1,16 @@
 #ifndef MSP_STRINGCODEC_WINDOWS1252_H_
 #define MSP_STRINGCODEC_WINDOWS1252_H_
 
+#include <msp/core/mspcore_api.h>
 #include "codec.h"
 
 namespace Msp {
 namespace StringCodec {
 
-class Windows1252: public StandardCodec<Windows1252>
+class MSPCORE_API Windows1252: public StandardCodec<Windows1252>
 {
 public:
-       class Encoder: public Codec::Encoder
+       class MSPCORE_API Encoder: public Codec::Encoder
        {
        public:
                Encoder(ErrorMode em = DEFAULT): Codec::Encoder(em) { }
@@ -19,7 +20,7 @@ public:
                void transliterate(unichar, std::string &) override;
        };
 
-       class Decoder: public Codec::Decoder
+       class MSPCORE_API Decoder: public Codec::Decoder
        {
        public:
                Decoder(ErrorMode em = DEFAULT): Codec::Decoder(em) { }
index d6db418f990a41089f41e8e60745e424327e3ca3..88b297d7bede12e4895398696e7b909f36bbd3ab 100644 (file)
@@ -4,10 +4,11 @@
 #include <ostream>
 #include <stdexcept>
 #include <string>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 
-class format_error: public std::logic_error
+class MSPCORE_API format_error: public std::logic_error
 {
 public:
        format_error(const std::string &w): std::logic_error(w) { }
@@ -34,7 +35,7 @@ Some new conversions are supported:
   b/B  Binary integer conversion
   P    Uppercase pointer conversion (like %#X)
 */
-class Fmt
+class MSPCORE_API Fmt
 {
 public:
        enum Type
index 49c40e9293512da2a656699d837f7f42834771c6..7969ef3930c01979e1948d63b97dccd9b6f2a026 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_STRINGS_FORMAT_H_
 
 #include <string>
+#include <msp/core/mspcore_api.h>
 #include "lexicalcast.h"
 
 namespace Msp {
@@ -9,7 +10,7 @@ namespace Msp {
 /**
 Printf-like string formatter class.
 */
-class Formatter
+class MSPCORE_API Formatter
 {
 private:
        std::string fmt;
index a58d0b14e1ffbc30049fba5f408809009954ea3a..5ae5f55861b85f4b6c216af23fd5759b90da3588 100644 (file)
@@ -2,11 +2,12 @@
 #define MSP_STRINGS_GLOB_H_
 
 #include <string>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 
-bool globmatch(const std::string &, const std::string &);
-bool globcasematch(const std::string &, const std::string &);
+MSPCORE_API bool globmatch(const std::string &, const std::string &);
+MSPCORE_API bool globcasematch(const std::string &, const std::string &);
 
 } // namespace Msp
 
index 12b5d08a1c9e3689f8ada501bc63a33931c9052d..ccb77909893091c4a929bbd51772ab5ef9046682 100644 (file)
@@ -5,6 +5,7 @@
 #include <string>
 #include <stdexcept>
 #include <msp/core/meta.h>
+#include <msp/core/mspcore_api.h>
 #include "fmt.h"
 
 namespace Msp {
@@ -12,7 +13,7 @@ namespace Msp {
 /**
 Thrown for errors in lexical conversions.
 */
-class lexical_error: public std::runtime_error
+class MSPCORE_API lexical_error: public std::runtime_error
 {
 public:
        lexical_error(const std::string &w): runtime_error(w) { }
@@ -22,7 +23,7 @@ public:
 /**
 Thrown when the format is unsuitable for the type being converted.
 */
-class format_mismatch: public lexical_error
+class MSPCORE_API format_mismatch: public lexical_error
 {
 public:
        format_mismatch(const std::string &w): lexical_error(w) { }
@@ -32,7 +33,7 @@ public:
 /**
 Helper class for lexical_cast to facilitate operator overloading.
 */
-class LexicalConverter
+class MSPCORE_API LexicalConverter
 {
 private:
        Fmt fmt;
@@ -49,41 +50,41 @@ public:
 };
 
 
-void operator<<(LexicalConverter &, char);
-void operator<<(LexicalConverter &, signed char);
-void operator<<(LexicalConverter &, short);
-void operator<<(LexicalConverter &, int);
-void operator<<(LexicalConverter &, long);
-void operator<<(LexicalConverter &, unsigned char);
-void operator<<(LexicalConverter &, unsigned short);
-void operator<<(LexicalConverter &, unsigned);
-void operator<<(LexicalConverter &, unsigned long);
-void operator<<(LexicalConverter &, long long);
-void operator<<(LexicalConverter &, unsigned long long);
-void operator<<(LexicalConverter &, bool);
-void operator<<(LexicalConverter &, float);
-void operator<<(LexicalConverter &, double);
-void operator<<(LexicalConverter &, long double);
-void operator<<(LexicalConverter &, const std::string &);
-void operator<<(LexicalConverter &, const char *);
-void operator<<(LexicalConverter &, const void *);
-
-void operator>>(const LexicalConverter &, char &);
-void operator>>(const LexicalConverter &, signed char &);
-void operator>>(const LexicalConverter &, short &);
-void operator>>(const LexicalConverter &, int &);
-void operator>>(const LexicalConverter &, long &);
-void operator>>(const LexicalConverter &, unsigned char &);
-void operator>>(const LexicalConverter &, unsigned short &);
-void operator>>(const LexicalConverter &, unsigned int &);
-void operator>>(const LexicalConverter &, unsigned long &);
-void operator>>(const LexicalConverter &, long long &);
-void operator>>(const LexicalConverter &, unsigned long long &);
-void operator>>(const LexicalConverter &, bool &);
-void operator>>(const LexicalConverter &, float &);
-void operator>>(const LexicalConverter &, double &);
-void operator>>(const LexicalConverter &, long double &);
-void operator>>(const LexicalConverter &, std::string &);
+MSPCORE_API void operator<<(LexicalConverter &, char);
+MSPCORE_API void operator<<(LexicalConverter &, signed char);
+MSPCORE_API void operator<<(LexicalConverter &, short);
+MSPCORE_API void operator<<(LexicalConverter &, int);
+MSPCORE_API void operator<<(LexicalConverter &, long);
+MSPCORE_API void operator<<(LexicalConverter &, unsigned char);
+MSPCORE_API void operator<<(LexicalConverter &, unsigned short);
+MSPCORE_API void operator<<(LexicalConverter &, unsigned);
+MSPCORE_API void operator<<(LexicalConverter &, unsigned long);
+MSPCORE_API void operator<<(LexicalConverter &, long long);
+MSPCORE_API void operator<<(LexicalConverter &, unsigned long long);
+MSPCORE_API void operator<<(LexicalConverter &, bool);
+MSPCORE_API void operator<<(LexicalConverter &, float);
+MSPCORE_API void operator<<(LexicalConverter &, double);
+MSPCORE_API void operator<<(LexicalConverter &, long double);
+MSPCORE_API void operator<<(LexicalConverter &, const std::string &);
+MSPCORE_API void operator<<(LexicalConverter &, const char *);
+MSPCORE_API void operator<<(LexicalConverter &, const void *);
+
+MSPCORE_API void operator>>(const LexicalConverter &, char &);
+MSPCORE_API void operator>>(const LexicalConverter &, signed char &);
+MSPCORE_API void operator>>(const LexicalConverter &, short &);
+MSPCORE_API void operator>>(const LexicalConverter &, int &);
+MSPCORE_API void operator>>(const LexicalConverter &, long &);
+MSPCORE_API void operator>>(const LexicalConverter &, unsigned char &);
+MSPCORE_API void operator>>(const LexicalConverter &, unsigned short &);
+MSPCORE_API void operator>>(const LexicalConverter &, unsigned int &);
+MSPCORE_API void operator>>(const LexicalConverter &, unsigned long &);
+MSPCORE_API void operator>>(const LexicalConverter &, long long &);
+MSPCORE_API void operator>>(const LexicalConverter &, unsigned long long &);
+MSPCORE_API void operator>>(const LexicalConverter &, bool &);
+MSPCORE_API void operator>>(const LexicalConverter &, float &);
+MSPCORE_API void operator>>(const LexicalConverter &, double &);
+MSPCORE_API void operator>>(const LexicalConverter &, long double &);
+MSPCORE_API void operator>>(const LexicalConverter &, std::string &);
 
 // Generic operators using stringstream
 
index acc842bc6e969807eac2e156be5ca5161df689d6..42c1e01a6951a4c3229c4d5b9eadad18bc119d0d 100644 (file)
@@ -3,11 +3,12 @@
 
 #include <stdexcept>
 #include <string>
+#include <msp/core/mspcore_api.h>
 #include "regmatch.h"
 
 namespace Msp {
 
-class bad_regex: public std::logic_error
+class MSPCORE_API bad_regex: public std::logic_error
 {
 public:
        bad_regex(const std::string &, const std::string &, const std::string::const_iterator &);
@@ -69,7 +70,7 @@ a bitmask.
 
 The MATCH_ANY instruction consumes the input character and always succeeds.
 */
-class Regex
+class MSPCORE_API Regex
 {
 private:
        typedef std::basic_string<unsigned char> Code;
index 6af309ea72185ea91e43706c1ef38538ced51976..8d4406a483ac19b01476a3684b73a2bde7a4e094 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 
@@ -16,7 +17,7 @@ part matched by the whole regex.  Further groups, if present, indicate parts
 matched by subregexes.  These are ordered from left to right, by the opening
 parenthesis of the subregex.
 */
-class RegMatch
+class MSPCORE_API RegMatch
 {
 public:
        /**
index f7e9433fd2d07a3e7496e7e7735af77d5dfff4c0..28763e6eba37df81efcdce612e9569db1bbdc27c 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 
@@ -10,22 +11,22 @@ namespace Msp {
 than, equal to or greater than zero depending on whether the first string
 lexicographically precedes, is equal to or follows the second one,
 respectively. */
-int strcasecmp(const std::string &s1, const std::string &s2);
+MSPCORE_API int strcasecmp(const std::string &s1, const std::string &s2);
 
 /** Converts a string to lower case. */
-std::string tolower(const std::string &);
+MSPCORE_API std::string tolower(const std::string &);
 
 /** Converts a string to upper case. */
-std::string toupper(const std::string &);
+MSPCORE_API std::string toupper(const std::string &);
 
 /** Checks whether a string consists of digits only. */
-bool isnumrc(const std::string &);
+MSPCORE_API bool isnumrc(const std::string &);
 
 /** Checks whether a string consists of alphabetic characters only. */
-bool isalpha(const std::string &);
+MSPCORE_API bool isalpha(const std::string &);
 
 /** Checks whether a string consists of alphanumeric characters only. */
-bool isalnum(const std::string &);
+MSPCORE_API bool isalnum(const std::string &);
 
 /* These are required to make the standard version work from inside the Msp
 namespace */
@@ -40,27 +41,27 @@ be treated as a single separator.
 
 If max_split is non-negative, at most that many split will be performed, i.e.
 the resulting vector will contain at most max_split+1 elements. */
-std::vector<std::string> split(const std::string &str, const std::string &sep = " \t\r\n", int max_split = -1);
+MSPCORE_API std::vector<std::string> split(const std::string &str, const std::string &sep = " \t\r\n", int max_split = -1);
 
 /** Splits a string on occurrences of a single character. */
-std::vector<std::string> split(const std::string &str, char sep, int max_split = -1);
+MSPCORE_API std::vector<std::string> split(const std::string &str, char sep, int max_split = -1);
 
 /** Splits a string on occurrences of another string. */
-std::vector<std::string> split_long(const std::string &str, const std::string &sep, int max_split = -1);
+MSPCORE_API std::vector<std::string> split_long(const std::string &str, const std::string &sep, int max_split = -1);
 
 /** Splits a string on occurrences of another string.  Two consecutive
 separators will cause an empty string to be placed in the result. */
-std::vector<std::string> split_fields(const std::string &str, const std::string &sep, int max_split = -1);
+MSPCORE_API std::vector<std::string> split_fields(const std::string &str, const std::string &sep, int max_split = -1);
 
 /** Splits a string on occurrences of a single character.  Two consecutive
 separators will cause an empty string to be placed in the result. */
-std::vector<std::string> split_fields(const std::string &str, char sep, int max_split = -1);
+MSPCORE_API std::vector<std::string> split_fields(const std::string &str, char sep, int max_split = -1);
 
 /** Appends a string to another, using a separator if both are non-empty. */
-std::string &append(std::string &str, const std::string &sep, const std::string &other);
+MSPCORE_API std::string &append(std::string &str, const std::string &sep, const std::string &other);
 
 /** Joins two strings, using a separator if both are non-empty. */
-std::string join(const std::string &str1, const std::string &sep, const std::string &str2);
+MSPCORE_API std::string join(const std::string &str1, const std::string &sep, const std::string &str2);
 
 /** Concatenates strings from an iterator range. */
 template<typename Iter>
@@ -74,14 +75,14 @@ std::string join(Iter begin, Iter end, const std::string &sep = " ")
 }
 
 /** Strips leading and trailing whitespace from a string. */
-std::string strip(const std::string &);
+MSPCORE_API std::string strip(const std::string &);
 
 /** Unescapes a string with C escape sequences. */
-std::string c_unescape(const std::string &str);
+MSPCORE_API std::string c_unescape(const std::string &str);
 
 /** Escapes any non-printable characters in a string with C escape sequences.
 Optionally, any characters with the high bit set can be escaped as well. */
-std::string c_escape(const std::string &str, bool escape_8bit = true);
+MSPCORE_API std::string c_escape(const std::string &str, bool escape_8bit = true);
 
 } // namespace Msp
 
index a5d91cf3451d4b547e93698cabd1f191983b4b0f..2336374c6ae12164145f6afbb68bc26a23e22deb 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_TIME_DATETIME_H_
 
 #include <string>
+#include <msp/core/mspcore_api.h>
 #include "timezone.h"
 #include "rawtime.h"
 
@@ -20,7 +21,7 @@ Due to the complex internal representation, arithmetic operations on a DateTime
 are relatively slow.  For purposes of internal scheduling in a program, a
 TimeStamp is a better choice.
 */
-class DateTime
+class MSPCORE_API DateTime
 {
 private:
        int year = 1970;
index 1a4274ba3a35c05822ad6f18c43775cf02e592e4..a6c7005b9a35639875e36d85cc6d5b97ed169b5c 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <cstdlib>
 #include <ctime>
+#include <msp/core/mspcore_api.h>
 #include <msp/strings/lexicalcast.h>
 #include "rawtime.h"
 
@@ -12,7 +13,7 @@ namespace Time {
 /**
 Represents a quantity of time, such as five seconds.
 */
-class TimeDelta
+class MSPCORE_API TimeDelta
 {
 private:
        RawTime usec = 0;
@@ -60,18 +61,18 @@ public:
 template<typename T>
 inline TimeDelta operator*(T a, const TimeDelta &t) { return t*a; }
 
-void operator<<(LexicalConverter &, const TimeDelta &);
+MSPCORE_API void operator<<(LexicalConverter &, const TimeDelta &);
 
 
 // Constants to be used in creation of TimeDeltas
-extern const TimeDelta zero;
-extern const TimeDelta usec;
-extern const TimeDelta msec;
-extern const TimeDelta sec;
-extern const TimeDelta min;
-extern const TimeDelta hour;
-extern const TimeDelta day;
-extern const TimeDelta week;
+MSPCORE_API extern const TimeDelta zero;
+MSPCORE_API extern const TimeDelta usec;
+MSPCORE_API extern const TimeDelta msec;
+MSPCORE_API extern const TimeDelta sec;
+MSPCORE_API extern const TimeDelta min;
+MSPCORE_API extern const TimeDelta hour;
+MSPCORE_API extern const TimeDelta day;
+MSPCORE_API extern const TimeDelta week;
 
 inline TimeDelta abs(const TimeDelta &t) { return t>=zero ? t : -t; }
 using std::abs;
index 04d0be95ba8fe0aa1117acf06f06bc3afc3c594d..7cb5c764d59979e0316e2e365444940ad8e4d786 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <vector>
 #include <sigc++/sigc++.h>
+#include <msp/core/mspcore_api.h>
 #include <msp/core/mutex.h>
 #include <msp/core/noncopyable.h>
 #include <msp/core/semaphore.h>
@@ -19,7 +20,7 @@ of the returned slot.
 
 This class is thread-safe, to allow running timers in a separate thread.
 */
-class Timer: private NonCopyable
+class MSPCORE_API Timer: private NonCopyable
 {
 public:
        class Slot
index 8068510a6647b00d739fba0d98cf31f5da4bbac8..50813057fa1492007eac716e80a857fd3fc615fe 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_TIME_TIMESTAMP_H_
 #define MSP_TIME_TIMESTAMP_H_
 
+#include <msp/core/mspcore_api.h>
 #include "timedelta.h"
 #include "rawtime.h"
 
@@ -13,7 +14,7 @@ function.
 
 For representing user-specified times, use the DateTime class.
 */
-class TimeStamp
+class MSPCORE_API TimeStamp
 {
 private:
        RawTime usec = 0;
index 3fbeb543a243e1a7abd8922e07617ea9cda83992..83b4b5835fe4298dc047b35040d9066762066139 100644 (file)
@@ -1,12 +1,13 @@
 #ifndef MSP_TIME_TIMEZONE_H_
 #define MSP_TIME_TIMEZONE_H_
 
+#include <msp/core/mspcore_api.h>
 #include "timedelta.h"
 
 namespace Msp {
 namespace Time {
 
-class TimeZone
+class MSPCORE_API TimeZone
 {
 private:
        std::string name;
index 00b6ef86c274dca75cdaac1bd38eeaa353b3819d..dd325b0a1d546d18b92b402bbc1eb6578ec26df7 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_TIME_UTILS_H_
 
 #include <string>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace Time {
@@ -10,15 +11,15 @@ class TimeDelta;
 class TimeStamp;
 
 /** Returns the current timestamp. */
-TimeStamp now();
+MSPCORE_API TimeStamp now();
 
-std::string format_now(const std::string &);
+MSPCORE_API std::string format_now(const std::string &);
 
 /** Returns the CPU time used by the program so far. */
-TimeDelta get_cpu_time();
+MSPCORE_API TimeDelta get_cpu_time();
 
 /** Sleeps for the given duration. */
-void sleep(const TimeDelta &);
+MSPCORE_API void sleep(const TimeDelta &);
 
 } // namespace Time
 } // namespace Msp