Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
S
spdlog
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
spdlog
Commits
93be7713
Commit
93be7713
authored
Nov 06, 2017
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
astyle
parent
6ab2f0e0
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
225 additions
and
111 deletions
+225
-111
mpmc_bounded_q.h
include/spdlog/details/mpmc_bounded_q.h
+25
-17
os.h
include/spdlog/details/os.h
+0
-0
format.h
include/spdlog/fmt/bundled/format.h
+0
-0
ostream.h
include/spdlog/fmt/bundled/ostream.h
+21
-12
posix.h
include/spdlog/fmt/bundled/posix.h
+111
-54
printf.h
include/spdlog/fmt/bundled/printf.h
+0
-0
time.h
include/spdlog/fmt/bundled/time.h
+64
-24
spdlog.h
include/spdlog/spdlog.h
+4
-4
No files found.
include/spdlog/details/mpmc_bounded_q.h
View file @
93be7713
...
@@ -50,13 +50,13 @@ Distributed under the MIT License (http://opensource.org/licenses/MIT)
...
@@ -50,13 +50,13 @@ Distributed under the MIT License (http://opensource.org/licenses/MIT)
namespace
spdlog
namespace
spdlog
{
{
namespace
details
namespace
details
{
{
template
<
typename
T
>
template
<
typename
T
>
class
mpmc_bounded_queue
class
mpmc_bounded_queue
{
{
public
:
public
:
using
item_type
=
T
;
using
item_type
=
T
;
mpmc_bounded_queue
(
size_t
buffer_size
)
mpmc_bounded_queue
(
size_t
buffer_size
)
...
@@ -84,18 +84,22 @@ namespace spdlog
...
@@ -84,18 +84,22 @@ namespace spdlog
{
{
cell_t
*
cell
;
cell_t
*
cell
;
size_t
pos
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
size_t
pos
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
for
(;;)
{
for
(;;)
{
cell
=
&
buffer_
[
pos
&
buffer_mask_
];
cell
=
&
buffer_
[
pos
&
buffer_mask_
];
size_t
seq
=
cell
->
sequence_
.
load
(
std
::
memory_order_acquire
);
size_t
seq
=
cell
->
sequence_
.
load
(
std
::
memory_order_acquire
);
intptr_t
dif
=
static_cast
<
intptr_t
>
(
seq
)
-
static_cast
<
intptr_t
>
(
pos
);
intptr_t
dif
=
static_cast
<
intptr_t
>
(
seq
)
-
static_cast
<
intptr_t
>
(
pos
);
if
(
dif
==
0
)
{
if
(
dif
==
0
)
{
if
(
enqueue_pos_
.
compare_exchange_weak
(
pos
,
pos
+
1
,
std
::
memory_order_relaxed
))
if
(
enqueue_pos_
.
compare_exchange_weak
(
pos
,
pos
+
1
,
std
::
memory_order_relaxed
))
break
;
break
;
}
}
else
if
(
dif
<
0
)
{
else
if
(
dif
<
0
)
{
return
false
;
return
false
;
}
}
else
{
else
{
pos
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
pos
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
}
}
}
}
...
@@ -108,12 +112,14 @@ namespace spdlog
...
@@ -108,12 +112,14 @@ namespace spdlog
{
{
cell_t
*
cell
;
cell_t
*
cell
;
size_t
pos
=
dequeue_pos_
.
load
(
std
::
memory_order_relaxed
);
size_t
pos
=
dequeue_pos_
.
load
(
std
::
memory_order_relaxed
);
for
(;;)
{
for
(;;)
{
cell
=
&
buffer_
[
pos
&
buffer_mask_
];
cell
=
&
buffer_
[
pos
&
buffer_mask_
];
size_t
seq
=
size_t
seq
=
cell
->
sequence_
.
load
(
std
::
memory_order_acquire
);
cell
->
sequence_
.
load
(
std
::
memory_order_acquire
);
intptr_t
dif
=
static_cast
<
intptr_t
>
(
seq
)
-
static_cast
<
intptr_t
>
(
pos
+
1
);
intptr_t
dif
=
static_cast
<
intptr_t
>
(
seq
)
-
static_cast
<
intptr_t
>
(
pos
+
1
);
if
(
dif
==
0
)
{
if
(
dif
==
0
)
{
if
(
dequeue_pos_
.
compare_exchange_weak
(
pos
,
pos
+
1
,
std
::
memory_order_relaxed
))
if
(
dequeue_pos_
.
compare_exchange_weak
(
pos
,
pos
+
1
,
std
::
memory_order_relaxed
))
break
;
break
;
}
}
...
@@ -131,15 +137,17 @@ namespace spdlog
...
@@ -131,15 +137,17 @@ namespace spdlog
{
{
size_t
front
,
front1
,
back
;
size_t
front
,
front1
,
back
;
// try to take a consistent snapshot of front/tail.
// try to take a consistent snapshot of front/tail.
do
{
do
{
front
=
enqueue_pos_
.
load
(
std
::
memory_order_acquire
);
front
=
enqueue_pos_
.
load
(
std
::
memory_order_acquire
);
back
=
dequeue_pos_
.
load
(
std
::
memory_order_acquire
);
back
=
dequeue_pos_
.
load
(
std
::
memory_order_acquire
);
front1
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
front1
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
}
while
(
front
!=
front1
);
}
while
(
front
!=
front1
);
return
back
==
front
;
return
back
==
front
;
}
}
private
:
private
:
struct
cell_t
struct
cell_t
{
{
std
::
atomic
<
size_t
>
sequence_
;
std
::
atomic
<
size_t
>
sequence_
;
...
@@ -162,7 +170,7 @@ namespace spdlog
...
@@ -162,7 +170,7 @@ namespace spdlog
mpmc_bounded_queue
(
mpmc_bounded_queue
const
&
)
=
delete
;
mpmc_bounded_queue
(
mpmc_bounded_queue
const
&
)
=
delete
;
void
operator
=
(
mpmc_bounded_queue
const
&
)
=
delete
;
void
operator
=
(
mpmc_bounded_queue
const
&
)
=
delete
;
};
};
}
// ns details
}
// ns details
}
// ns spdlog
}
// ns spdlog
include/spdlog/details/os.h
View file @
93be7713
include/spdlog/fmt/bundled/format.h
View file @
93be7713
This source diff could not be displayed because it is too large. You can
view the blob
instead.
include/spdlog/fmt/bundled/ostream.h
View file @
93be7713
...
@@ -13,22 +13,25 @@
...
@@ -13,22 +13,25 @@
#include "format.h"
#include "format.h"
#include <ostream>
#include <ostream>
namespace
fmt
{
namespace
fmt
{
namespace
internal
{
namespace
internal
{
template
<
class
Char
>
template
<
class
Char
>
class
FormatBuf
:
public
std
::
basic_streambuf
<
Char
>
{
class
FormatBuf
:
public
std
::
basic_streambuf
<
Char
>
private
:
{
private
:
typedef
typename
std
::
basic_streambuf
<
Char
>::
int_type
int_type
;
typedef
typename
std
::
basic_streambuf
<
Char
>::
int_type
int_type
;
typedef
typename
std
::
basic_streambuf
<
Char
>::
traits_type
traits_type
;
typedef
typename
std
::
basic_streambuf
<
Char
>::
traits_type
traits_type
;
Buffer
<
Char
>
&
buffer_
;
Buffer
<
Char
>
&
buffer_
;
public
:
public
:
FormatBuf
(
Buffer
<
Char
>
&
buffer
)
:
buffer_
(
buffer
)
{}
FormatBuf
(
Buffer
<
Char
>
&
buffer
)
:
buffer_
(
buffer
)
{}
protected
:
protected
:
// The put-area is actually always empty. This makes the implementation
// The put-area is actually always empty. This makes the implementation
// simpler and has the advantage that the streambuf and the buffer are always
// simpler and has the advantage that the streambuf and the buffer are always
// in sync and sputc never writes into uninitialized memory. The obvious
// in sync and sputc never writes into uninitialized memory. The obvious
...
@@ -36,13 +39,15 @@ class FormatBuf : public std::basic_streambuf<Char> {
...
@@ -36,13 +39,15 @@ class FormatBuf : public std::basic_streambuf<Char> {
// to overflow. There is no disadvantage here for sputn since this always
// to overflow. There is no disadvantage here for sputn since this always
// results in a call to xsputn.
// results in a call to xsputn.
int_type
overflow
(
int_type
ch
=
traits_type
::
eof
())
FMT_OVERRIDE
{
int_type
overflow
(
int_type
ch
=
traits_type
::
eof
())
FMT_OVERRIDE
{
if
(
!
traits_type
::
eq_int_type
(
ch
,
traits_type
::
eof
()))
if
(
!
traits_type
::
eq_int_type
(
ch
,
traits_type
::
eof
()))
buffer_
.
push_back
(
static_cast
<
Char
>
(
ch
));
buffer_
.
push_back
(
static_cast
<
Char
>
(
ch
));
return
ch
;
return
ch
;
}
}
std
::
streamsize
xsputn
(
const
Char
*
s
,
std
::
streamsize
count
)
FMT_OVERRIDE
{
std
::
streamsize
xsputn
(
const
Char
*
s
,
std
::
streamsize
count
)
FMT_OVERRIDE
{
buffer_
.
append
(
s
,
s
+
count
);
buffer_
.
append
(
s
,
s
+
count
);
return
count
;
return
count
;
}
}
...
@@ -50,7 +55,8 @@ class FormatBuf : public std::basic_streambuf<Char> {
...
@@ -50,7 +55,8 @@ class FormatBuf : public std::basic_streambuf<Char> {
Yes
&
convert
(
std
::
ostream
&
);
Yes
&
convert
(
std
::
ostream
&
);
struct
DummyStream
:
std
::
ostream
{
struct
DummyStream
:
std
::
ostream
{
DummyStream
();
// Suppress a bogus warning in MSVC.
DummyStream
();
// Suppress a bogus warning in MSVC.
// Hide all operator<< overloads from std::ostream.
// Hide all operator<< overloads from std::ostream.
void
operator
<<
(
Null
<>
);
void
operator
<<
(
Null
<>
);
...
@@ -59,9 +65,11 @@ struct DummyStream : std::ostream {
...
@@ -59,9 +65,11 @@ struct DummyStream : std::ostream {
No
&
operator
<<
(
std
::
ostream
&
,
int
);
No
&
operator
<<
(
std
::
ostream
&
,
int
);
template
<
typename
T
>
template
<
typename
T
>
struct
ConvertToIntImpl
<
T
,
true
>
{
struct
ConvertToIntImpl
<
T
,
true
>
{
// Convert to int only if T doesn't have an overloaded operator<<.
// Convert to int only if T doesn't have an overloaded operator<<.
enum
{
enum
{
value
=
sizeof
(
convert
(
get
<
DummyStream
>
()
<<
get
<
T
>
()))
==
sizeof
(
No
)
value
=
sizeof
(
convert
(
get
<
DummyStream
>
()
<<
get
<
T
>
()))
==
sizeof
(
No
)
};
};
};
};
...
@@ -73,7 +81,8 @@ FMT_API void write(std::ostream &os, Writer &w);
...
@@ -73,7 +81,8 @@ FMT_API void write(std::ostream &os, Writer &w);
// Formats a value.
// Formats a value.
template
<
typename
Char
,
typename
ArgFormatter_
,
typename
T
>
template
<
typename
Char
,
typename
ArgFormatter_
,
typename
T
>
void
format_arg
(
BasicFormatter
<
Char
,
ArgFormatter_
>
&
f
,
void
format_arg
(
BasicFormatter
<
Char
,
ArgFormatter_
>
&
f
,
const
Char
*&
format_str
,
const
T
&
value
)
{
const
Char
*&
format_str
,
const
T
&
value
)
{
internal
::
MemoryBuffer
<
Char
,
internal
::
INLINE_BUFFER_SIZE
>
buffer
;
internal
::
MemoryBuffer
<
Char
,
internal
::
INLINE_BUFFER_SIZE
>
buffer
;
internal
::
FormatBuf
<
Char
>
format_buf
(
buffer
);
internal
::
FormatBuf
<
Char
>
format_buf
(
buffer
);
...
...
include/spdlog/fmt/bundled/posix.h
View file @
93be7713
...
@@ -64,31 +64,39 @@
...
@@ -64,31 +64,39 @@
#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
namespace
fmt
{
namespace
fmt
{
// An error code.
// An error code.
class
ErrorCode
{
class
ErrorCode
private
:
{
private
:
int
value_
;
int
value_
;
public
:
public
:
explicit
ErrorCode
(
int
value
=
0
)
FMT_NOEXCEPT
:
value_
(
value
)
{}
explicit
ErrorCode
(
int
value
=
0
)
FMT_NOEXCEPT
:
value_
(
value
)
{}
int
get
()
const
FMT_NOEXCEPT
{
return
value_
;
}
int
get
()
const
FMT_NOEXCEPT
{
return
value_
;
}
};
};
// A buffered file.
// A buffered file.
class
BufferedFile
{
class
BufferedFile
private
:
{
private
:
FILE
*
file_
;
FILE
*
file_
;
friend
class
File
;
friend
class
File
;
explicit
BufferedFile
(
FILE
*
f
)
:
file_
(
f
)
{}
explicit
BufferedFile
(
FILE
*
f
)
:
file_
(
f
)
{}
public
:
public
:
// Constructs a BufferedFile object which doesn't represent any file.
// Constructs a BufferedFile object which doesn't represent any file.
BufferedFile
()
FMT_NOEXCEPT
:
file_
(
FMT_NULL
)
{}
BufferedFile
()
FMT_NOEXCEPT
:
file_
(
FMT_NULL
)
{}
// Destroys the object closing the file it represents if any.
// Destroys the object closing the file it represents if any.
FMT_API
~
BufferedFile
()
FMT_NOEXCEPT
;
FMT_API
~
BufferedFile
()
FMT_NOEXCEPT
;
...
@@ -97,31 +105,37 @@ class BufferedFile {
...
@@ -97,31 +105,37 @@ class BufferedFile {
// Emulate a move constructor and a move assignment operator if rvalue
// Emulate a move constructor and a move assignment operator if rvalue
// references are not supported.
// references are not supported.
private
:
private
:
// A proxy object to emulate a move constructor.
// A proxy object to emulate a move constructor.
// It is private to make it impossible call operator Proxy directly.
// It is private to make it impossible call operator Proxy directly.
struct
Proxy
{
struct
Proxy
{
FILE
*
file
;
FILE
*
file
;
};
};
public
:
public
:
// A "move constructor" for moving from a temporary.
// A "move constructor" for moving from a temporary.
BufferedFile
(
Proxy
p
)
FMT_NOEXCEPT
:
file_
(
p
.
file
)
{}
BufferedFile
(
Proxy
p
)
FMT_NOEXCEPT
:
file_
(
p
.
file
)
{}
// A "move constructor" for moving from an lvalue.
// A "move constructor" for moving from an lvalue.
BufferedFile
(
BufferedFile
&
f
)
FMT_NOEXCEPT
:
file_
(
f
.
file_
)
{
BufferedFile
(
BufferedFile
&
f
)
FMT_NOEXCEPT
:
file_
(
f
.
file_
)
{
f
.
file_
=
FMT_NULL
;
f
.
file_
=
FMT_NULL
;
}
}
// A "move assignment operator" for moving from a temporary.
// A "move assignment operator" for moving from a temporary.
BufferedFile
&
operator
=
(
Proxy
p
)
{
BufferedFile
&
operator
=
(
Proxy
p
)
{
close
();
close
();
file_
=
p
.
file
;
file_
=
p
.
file
;
return
*
this
;
return
*
this
;
}
}
// A "move assignment operator" for moving from an lvalue.
// A "move assignment operator" for moving from an lvalue.
BufferedFile
&
operator
=
(
BufferedFile
&
other
)
{
BufferedFile
&
operator
=
(
BufferedFile
&
other
)
{
close
();
close
();
file_
=
other
.
file_
;
file_
=
other
.
file_
;
other
.
file_
=
FMT_NULL
;
other
.
file_
=
FMT_NULL
;
...
@@ -130,22 +144,26 @@ public:
...
@@ -130,22 +144,26 @@ public:
// Returns a proxy object for moving from a temporary:
// Returns a proxy object for moving from a temporary:
// BufferedFile file = BufferedFile(...);
// BufferedFile file = BufferedFile(...);
operator
Proxy
()
FMT_NOEXCEPT
{
operator
Proxy
()
FMT_NOEXCEPT
{
Proxy
p
=
{
file_
};
Proxy
p
=
{
file_
};
file_
=
FMT_NULL
;
file_
=
FMT_NULL
;
return
p
;
return
p
;
}
}
#else
#else
private
:
private
:
FMT_DISALLOW_COPY_AND_ASSIGN
(
BufferedFile
);
FMT_DISALLOW_COPY_AND_ASSIGN
(
BufferedFile
);
public
:
public
:
BufferedFile
(
BufferedFile
&&
other
)
FMT_NOEXCEPT
:
file_
(
other
.
file_
)
{
BufferedFile
(
BufferedFile
&&
other
)
FMT_NOEXCEPT
:
file_
(
other
.
file_
)
{
other
.
file_
=
FMT_NULL
;
other
.
file_
=
FMT_NULL
;
}
}
BufferedFile
&
operator
=
(
BufferedFile
&&
other
)
{
BufferedFile
&
operator
=
(
BufferedFile
&&
other
)
{
close
();
close
();
file_
=
other
.
file_
;
file_
=
other
.
file_
;
other
.
file_
=
FMT_NULL
;
other
.
file_
=
FMT_NULL
;
...
@@ -160,13 +178,17 @@ public:
...
@@ -160,13 +178,17 @@ public:
FMT_API
void
close
();
FMT_API
void
close
();
// Returns the pointer to a FILE object representing this file.
// Returns the pointer to a FILE object representing this file.
FILE
*
get
()
const
FMT_NOEXCEPT
{
return
file_
;
}
FILE
*
get
()
const
FMT_NOEXCEPT
{
return
file_
;
}
// We place parentheses around fileno to workaround a bug in some versions
// We place parentheses around fileno to workaround a bug in some versions
// of MinGW that define fileno as a macro.
// of MinGW that define fileno as a macro.
FMT_API
int
(
fileno
)()
const
;
FMT_API
int
(
fileno
)()
const
;
void
print
(
CStringRef
format_str
,
const
ArgList
&
args
)
{
void
print
(
CStringRef
format_str
,
const
ArgList
&
args
)
{
fmt
::
print
(
file_
,
format_str
,
args
);
fmt
::
print
(
file_
,
format_str
,
args
);
}
}
FMT_VARIADIC
(
void
,
print
,
CStringRef
)
FMT_VARIADIC
(
void
,
print
,
CStringRef
)
...
@@ -178,23 +200,26 @@ public:
...
@@ -178,23 +200,26 @@ public:
// closing the file multiple times will cause a crash on Windows rather
// closing the file multiple times will cause a crash on Windows rather
// than an exception. You can get standard behavior by overriding the
// than an exception. You can get standard behavior by overriding the
// invalid parameter handler with _set_invalid_parameter_handler.
// invalid parameter handler with _set_invalid_parameter_handler.
class
File
{
class
File
private
:
{
private
:
int
fd_
;
// File descriptor.
int
fd_
;
// File descriptor.
// Constructs a File object with a given descriptor.
// Constructs a File object with a given descriptor.
explicit
File
(
int
fd
)
:
fd_
(
fd
)
{}
explicit
File
(
int
fd
)
:
fd_
(
fd
)
{}
public
:
public
:
// Possible values for the oflag argument to the constructor.
// Possible values for the oflag argument to the constructor.
enum
{
enum
{
RDONLY
=
FMT_POSIX
(
O_RDONLY
),
// Open for reading only.
RDONLY
=
FMT_POSIX
(
O_RDONLY
),
// Open for reading only.
WRONLY
=
FMT_POSIX
(
O_WRONLY
),
// Open for writing only.
WRONLY
=
FMT_POSIX
(
O_WRONLY
),
// Open for writing only.
RDWR
=
FMT_POSIX
(
O_RDWR
)
// Open for reading and writing.
RDWR
=
FMT_POSIX
(
O_RDWR
)
// Open for reading and writing.
};
};
// Constructs a File object which doesn't represent any file.
// Constructs a File object which doesn't represent any file.
File
()
FMT_NOEXCEPT
:
fd_
(
-
1
)
{}
File
()
FMT_NOEXCEPT
:
fd_
(
-
1
)
{}
// Opens a file and constructs a File object representing this file.
// Opens a file and constructs a File object representing this file.
FMT_API
File
(
CStringRef
path
,
int
oflag
);
FMT_API
File
(
CStringRef
path
,
int
oflag
);
...
@@ -203,31 +228,37 @@ class File {
...
@@ -203,31 +228,37 @@ class File {
// Emulate a move constructor and a move assignment operator if rvalue
// Emulate a move constructor and a move assignment operator if rvalue
// references are not supported.
// references are not supported.
private
:
private
:
// A proxy object to emulate a move constructor.
// A proxy object to emulate a move constructor.
// It is private to make it impossible call operator Proxy directly.
// It is private to make it impossible call operator Proxy directly.
struct
Proxy
{
struct
Proxy
{
int
fd
;
int
fd
;
};
};
public
:
public
:
// A "move constructor" for moving from a temporary.
// A "move constructor" for moving from a temporary.
File
(
Proxy
p
)
FMT_NOEXCEPT
:
fd_
(
p
.
fd
)
{}
File
(
Proxy
p
)
FMT_NOEXCEPT
:
fd_
(
p
.
fd
)
{}
// A "move constructor" for moving from an lvalue.
// A "move constructor" for moving from an lvalue.
File
(
File
&
other
)
FMT_NOEXCEPT
:
fd_
(
other
.
fd_
)
{
File
(
File
&
other
)
FMT_NOEXCEPT
:
fd_
(
other
.
fd_
)
{
other
.
fd_
=
-
1
;
other
.
fd_
=
-
1
;
}
}
// A "move assignment operator" for moving from a temporary.
// A "move assignment operator" for moving from a temporary.
File
&
operator
=
(
Proxy
p
)
{
File
&
operator
=
(
Proxy
p
)
{
close
();
close
();
fd_
=
p
.
fd
;
fd_
=
p
.
fd
;
return
*
this
;
return
*
this
;
}
}
// A "move assignment operator" for moving from an lvalue.
// A "move assignment operator" for moving from an lvalue.
File
&
operator
=
(
File
&
other
)
{
File
&
operator
=
(
File
&
other
)
{
close
();
close
();
fd_
=
other
.
fd_
;
fd_
=
other
.
fd_
;
other
.
fd_
=
-
1
;
other
.
fd_
=
-
1
;
...
@@ -236,22 +267,26 @@ class File {
...
@@ -236,22 +267,26 @@ class File {
// Returns a proxy object for moving from a temporary:
// Returns a proxy object for moving from a temporary:
// File file = File(...);
// File file = File(...);
operator
Proxy
()
FMT_NOEXCEPT
{
operator
Proxy
()
FMT_NOEXCEPT
{
Proxy
p
=
{
fd_
};
Proxy
p
=
{
fd_
};
fd_
=
-
1
;
fd_
=
-
1
;
return
p
;
return
p
;
}
}
#else
#else
private
:
private
:
FMT_DISALLOW_COPY_AND_ASSIGN
(
File
);
FMT_DISALLOW_COPY_AND_ASSIGN
(
File
);
public
:
public
:
File
(
File
&&
other
)
FMT_NOEXCEPT
:
fd_
(
other
.
fd_
)
{
File
(
File
&&
other
)
FMT_NOEXCEPT
:
fd_
(
other
.
fd_
)
{
other
.
fd_
=
-
1
;
other
.
fd_
=
-
1
;
}
}
File
&
operator
=
(
File
&&
other
)
{
File
&
operator
=
(
File
&&
other
)
{
close
();
close
();
fd_
=
other
.
fd_
;
fd_
=
other
.
fd_
;
other
.
fd_
=
-
1
;
other
.
fd_
=
-
1
;
...
@@ -263,7 +298,10 @@ class File {
...
@@ -263,7 +298,10 @@ class File {
FMT_API
~
File
()
FMT_NOEXCEPT
;
FMT_API
~
File
()
FMT_NOEXCEPT
;
// Returns the file descriptor.
// Returns the file descriptor.
int
descriptor
()
const
FMT_NOEXCEPT
{
return
fd_
;
}
int
descriptor
()
const
FMT_NOEXCEPT
{
return
fd_
;
}
// Closes the file.
// Closes the file.
FMT_API
void
close
();
FMT_API
void
close
();
...
@@ -309,22 +347,26 @@ long getpagesize();
...
@@ -309,22 +347,26 @@ long getpagesize();
#ifdef FMT_LOCALE
#ifdef FMT_LOCALE
// A "C" numeric locale.
// A "C" numeric locale.
class
Locale
{
class
Locale
private
:
{
private
:
# ifdef _MSC_VER
# ifdef _MSC_VER
typedef
_locale_t
locale_t
;
typedef
_locale_t
locale_t
;
enum
{
LC_NUMERIC_MASK
=
LC_NUMERIC
};
enum
{
LC_NUMERIC_MASK
=
LC_NUMERIC
};
static
locale_t
newlocale
(
int
category_mask
,
const
char
*
locale
,
locale_t
)
{
static
locale_t
newlocale
(
int
category_mask
,
const
char
*
locale
,
locale_t
)
{
return
_create_locale
(
category_mask
,
locale
);
return
_create_locale
(
category_mask
,
locale
);
}
}
static
void
freelocale
(
locale_t
locale
)
{
static
void
freelocale
(
locale_t
locale
)
{
_free_locale
(
locale
);
_free_locale
(
locale
);
}
}
static
double
strtod_l
(
const
char
*
nptr
,
char
**
endptr
,
_locale_t
locale
)
{
static
double
strtod_l
(
const
char
*
nptr
,
char
**
endptr
,
_locale_t
locale
)
{
return
_strtod_l
(
nptr
,
endptr
,
locale
);
return
_strtod_l
(
nptr
,
endptr
,
locale
);
}
}
# endif
# endif
...
@@ -333,20 +375,28 @@ class Locale {
...
@@ -333,20 +375,28 @@ class Locale {
FMT_DISALLOW_COPY_AND_ASSIGN
(
Locale
);
FMT_DISALLOW_COPY_AND_ASSIGN
(
Locale
);
public
:
public
:
typedef
locale_t
Type
;
typedef
locale_t
Type
;
Locale
()
:
locale_
(
newlocale
(
LC_NUMERIC_MASK
,
"C"
,
FMT_NULL
))
{
Locale
()
:
locale_
(
newlocale
(
LC_NUMERIC_MASK
,
"C"
,
FMT_NULL
))
{
if
(
!
locale_
)
if
(
!
locale_
)
FMT_THROW
(
fmt
::
SystemError
(
errno
,
"cannot create locale"
));
FMT_THROW
(
fmt
::
SystemError
(
errno
,
"cannot create locale"
));
}
}
~
Locale
()
{
freelocale
(
locale_
);
}
~
Locale
()
{
freelocale
(
locale_
);
}
Type
get
()
const
{
return
locale_
;
}
Type
get
()
const
{
return
locale_
;
}
// Converts string to floating-point number and advances str past the end
// Converts string to floating-point number and advances str past the end
// of the parsed input.
// of the parsed input.
double
strtod
(
const
char
*&
str
)
const
{
double
strtod
(
const
char
*&
str
)
const
{
char
*
end
=
FMT_NULL
;
char
*
end
=
FMT_NULL
;
double
result
=
strtod_l
(
str
,
&
end
,
locale_
);
double
result
=
strtod_l
(
str
,
&
end
,
locale_
);
str
=
end
;
str
=
end
;
...
@@ -357,10 +407,17 @@ class Locale {
...
@@ -357,10 +407,17 @@ class Locale {
}
// namespace fmt
}
// namespace fmt
#if !FMT_USE_RVALUE_REFERENCES
#if !FMT_USE_RVALUE_REFERENCES
namespace
std
{
namespace
std
{
// For compatibility with C++98.
// For compatibility with C++98.
inline
fmt
::
BufferedFile
&
move
(
fmt
::
BufferedFile
&
f
)
{
return
f
;
}
inline
fmt
::
BufferedFile
&
move
(
fmt
::
BufferedFile
&
f
)
inline
fmt
::
File
&
move
(
fmt
::
File
&
f
)
{
return
f
;
}
{
return
f
;
}
inline
fmt
::
File
&
move
(
fmt
::
File
&
f
)
{
return
f
;
}
}
}
#endif
#endif
...
...
include/spdlog/fmt/bundled/printf.h
View file @
93be7713
This diff is collapsed.
Click to expand it.
include/spdlog/fmt/bundled/time.h
View file @
93be7713
...
@@ -19,10 +19,12 @@
...
@@ -19,10 +19,12 @@
# pragma warning(disable: 4996) // "deprecated" functions
# pragma warning(disable: 4996) // "deprecated" functions
#endif
#endif
namespace
fmt
{
namespace
fmt
{
template
<
typename
ArgFormatter
>
template
<
typename
ArgFormatter
>
void
format_arg
(
BasicFormatter
<
char
,
ArgFormatter
>
&
f
,
void
format_arg
(
BasicFormatter
<
char
,
ArgFormatter
>
&
f
,
const
char
*&
format_str
,
const
std
::
tm
&
tm
)
{
const
char
*&
format_str
,
const
std
::
tm
&
tm
)
{
if
(
*
format_str
==
':'
)
if
(
*
format_str
==
':'
)
++
format_str
;
++
format_str
;
const
char
*
end
=
format_str
;
const
char
*
end
=
format_str
;
...
@@ -35,14 +37,17 @@ void format_arg(BasicFormatter<char, ArgFormatter> &f,
...
@@ -35,14 +37,17 @@ void format_arg(BasicFormatter<char, ArgFormatter> &f,
format
[
format
.
size
()
-
1
]
=
'\0'
;
format
[
format
.
size
()
-
1
]
=
'\0'
;
Buffer
<
char
>
&
buffer
=
f
.
writer
().
buffer
();
Buffer
<
char
>
&
buffer
=
f
.
writer
().
buffer
();
std
::
size_t
start
=
buffer
.
size
();
std
::
size_t
start
=
buffer
.
size
();
for
(;;)
{
for
(;;)
{
std
::
size_t
size
=
buffer
.
capacity
()
-
start
;
std
::
size_t
size
=
buffer
.
capacity
()
-
start
;
std
::
size_t
count
=
std
::
strftime
(
&
buffer
[
start
],
size
,
&
format
[
0
],
&
tm
);
std
::
size_t
count
=
std
::
strftime
(
&
buffer
[
start
],
size
,
&
format
[
0
],
&
tm
);
if
(
count
!=
0
)
{
if
(
count
!=
0
)
{
buffer
.
resize
(
start
+
count
);
buffer
.
resize
(
start
+
count
);
break
;
break
;
}
}
if
(
size
>=
format
.
size
()
*
256
)
{
if
(
size
>=
format
.
size
()
*
256
)
{
// If the buffer is 256 times larger than the format string, assume
// If the buffer is 256 times larger than the format string, assume
// that `strftime` gives an empty result. There doesn't seem to be a
// that `strftime` gives an empty result. There doesn't seem to be a
// better way to distinguish the two cases:
// better way to distinguish the two cases:
...
@@ -55,36 +60,60 @@ void format_arg(BasicFormatter<char, ArgFormatter> &f,
...
@@ -55,36 +60,60 @@ void format_arg(BasicFormatter<char, ArgFormatter> &f,
format_str
=
end
+
1
;
format_str
=
end
+
1
;
}
}
namespace
internal
{
namespace
internal
inline
Null
<>
localtime_r
(...)
{
return
Null
<>
();
}
{
inline
Null
<>
localtime_s
(...)
{
return
Null
<>
();
}
inline
Null
<>
localtime_r
(...)
inline
Null
<>
gmtime_r
(...)
{
return
Null
<>
();
}
{
inline
Null
<>
gmtime_s
(...)
{
return
Null
<>
();
}
return
Null
<>
();
}
inline
Null
<>
localtime_s
(...)
{
return
Null
<>
();
}
inline
Null
<>
gmtime_r
(...)
{
return
Null
<>
();
}
inline
Null
<>
gmtime_s
(...)
{
return
Null
<>
();
}
}
}
// Thread-safe replacement for std::localtime
// Thread-safe replacement for std::localtime
inline
std
::
tm
localtime
(
std
::
time_t
time
)
{
inline
std
::
tm
localtime
(
std
::
time_t
time
)
struct
LocalTime
{
{
struct
LocalTime
{
std
::
time_t
time_
;
std
::
time_t
time_
;
std
::
tm
tm_
;
std
::
tm
tm_
;
LocalTime
(
std
::
time_t
t
)
:
time_
(
t
)
{}
LocalTime
(
std
::
time_t
t
)
:
time_
(
t
)
{}
bool
run
()
{
bool
run
()
{
using
namespace
fmt
::
internal
;
using
namespace
fmt
::
internal
;
return
handle
(
localtime_r
(
&
time_
,
&
tm_
));
return
handle
(
localtime_r
(
&
time_
,
&
tm_
));
}
}
bool
handle
(
std
::
tm
*
tm
)
{
return
tm
!=
FMT_NULL
;
}
bool
handle
(
std
::
tm
*
tm
)
{
return
tm
!=
FMT_NULL
;
}
bool
handle
(
internal
::
Null
<>
)
{
bool
handle
(
internal
::
Null
<>
)
{
using
namespace
fmt
::
internal
;
using
namespace
fmt
::
internal
;
return
fallback
(
localtime_s
(
&
tm_
,
&
time_
));
return
fallback
(
localtime_s
(
&
tm_
,
&
time_
));
}
}
bool
fallback
(
int
res
)
{
return
res
==
0
;
}
bool
fallback
(
int
res
)
{
return
res
==
0
;
}
bool
fallback
(
internal
::
Null
<>
)
{
bool
fallback
(
internal
::
Null
<>
)
{
using
namespace
fmt
::
internal
;
using
namespace
fmt
::
internal
;
std
::
tm
*
tm
=
std
::
localtime
(
&
time_
);
std
::
tm
*
tm
=
std
::
localtime
(
&
time_
);
if
(
tm
)
tm_
=
*
tm
;
if
(
tm
)
tm_
=
*
tm
;
...
@@ -100,28 +129,39 @@ inline std::tm localtime(std::time_t time) {
...
@@ -100,28 +129,39 @@ inline std::tm localtime(std::time_t time) {
}
}
// Thread-safe replacement for std::gmtime
// Thread-safe replacement for std::gmtime
inline
std
::
tm
gmtime
(
std
::
time_t
time
)
{
inline
std
::
tm
gmtime
(
std
::
time_t
time
)
struct
GMTime
{
{
struct
GMTime
{
std
::
time_t
time_
;
std
::
time_t
time_
;
std
::
tm
tm_
;
std
::
tm
tm_
;
GMTime
(
std
::
time_t
t
)
:
time_
(
t
)
{}
GMTime
(
std
::
time_t
t
)
:
time_
(
t
)
{}
bool
run
()
{
bool
run
()
{
using
namespace
fmt
::
internal
;
using
namespace
fmt
::
internal
;
return
handle
(
gmtime_r
(
&
time_
,
&
tm_
));
return
handle
(
gmtime_r
(
&
time_
,
&
tm_
));
}
}
bool
handle
(
std
::
tm
*
tm
)
{
return
tm
!=
FMT_NULL
;
}
bool
handle
(
std
::
tm
*
tm
)
{
return
tm
!=
FMT_NULL
;
}
bool
handle
(
internal
::
Null
<>
)
{
bool
handle
(
internal
::
Null
<>
)
{
using
namespace
fmt
::
internal
;
using
namespace
fmt
::
internal
;
return
fallback
(
gmtime_s
(
&
tm_
,
&
time_
));
return
fallback
(
gmtime_s
(
&
tm_
,
&
time_
));
}
}
bool
fallback
(
int
res
)
{
return
res
==
0
;
}
bool
fallback
(
int
res
)
{
return
res
==
0
;
}
bool
fallback
(
internal
::
Null
<>
)
{
bool
fallback
(
internal
::
Null
<>
)
{
std
::
tm
*
tm
=
std
::
gmtime
(
&
time_
);
std
::
tm
*
tm
=
std
::
gmtime
(
&
time_
);
if
(
tm
!=
FMT_NULL
)
tm_
=
*
tm
;
if
(
tm
!=
FMT_NULL
)
tm_
=
*
tm
;
return
tm
!=
FMT_NULL
;
return
tm
!=
FMT_NULL
;
...
...
include/spdlog/spdlog.h
View file @
93be7713
...
@@ -169,11 +169,11 @@ void drop_all();
...
@@ -169,11 +169,11 @@ void drop_all();
#define SPDLOG_STR_H(x) #x
#define SPDLOG_STR_H(x) #x
#define SPDLOG_STR_HELPER(x) SPDLOG_STR_H(x)
#define SPDLOG_STR_HELPER(x) SPDLOG_STR_H(x)
#ifdef _MSC_VER
#ifdef _MSC_VER
#define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
#define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
#else
#else
#define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
#define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
#endif
#endif
#else
#else
#define SPDLOG_TRACE(logger, ...)
#define SPDLOG_TRACE(logger, ...)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment