В каких случаях стоит создавать свои пространства имен?
На мой взгляд это стоит делать почти в любой программе, т.к. это защитит от дублирования имен функций, да и так легче ориентироваться по кускам кода и это удобный метод разбивать разбивать код на модули.
Когда возникает система классов, констант, функций, возможно глобальных переменных и объектов, которая описывает сущности одной задачи или набора связанных задач и создаёт инструменты для их решения, для каких-либо действий с этими сущностями.
Например, пространство имён, содержащее классы описания сокетов, IP-адресов, соединений, функции для создания соединения, принятия входящего запроса, отправки и принятия данных. Или другой пример: набор разных алгоритмов для работы с матрицами, определение типа "матрица" и "вектор" как стандартного или пользовательского с помощью using/typedef.